簡體   English   中英

從外部訪問匿名函數內的變量

[英]access variable inside anonymous function from outside

jquery-ui對話框小部件被包裝(就像所有其他小部件一樣)在匿名函數中。

在這個函數里面有一個名為sizeRelatedOptions的變量。 我需要從包裝閉包外部向該對象添加一個鍵。 實現這一目標的最佳方法是什么?

(function( $, undefined ) {

    var sizeRelatedOptions = {
        buttons: true,
        height: true,
        //etc
    }

    $.widget( "ui.dialog", {
        //widget code
    });

}( jQuery ) );

編輯#1:上面的代碼是jQuery ui的源代碼

編輯#2 :我現在明白我不能簡單地訪問該變量。 所以我必須解決這個問題。 因此,這里有一些關於我為什么需要這個的更多信息:

我正在擴展jQuery ui的對話框小部件以添加另一個buttonPane。 為了在窗格添加到窗口小部件后使窗口小部件自行調整大小,我想向sizeRelatedOption添加一個選項。 (這就是這個問題的第一個問題。)因為對話框小部件的_options函數檢查sizeRelatedOption的選項是否作為鍵存在。 在這種情況下,它會調用_size函數來調整窗口小部件的大小。

希望我讓自己有點清楚。

你不能不直接修改源代碼,但這不是你應該考慮的選項,因為這是一個非常糟糕的做法,原因很多。

該變量是該范圍的私有變量,除非該對象使其可公開訪問,否則您的代碼必須在聲明變量才能訪問它的同一范圍或子范圍內運行。

但是,如果您嘗試更改某些配置選項,則窗口小部件已為此提供API

例如,

$('#dialog').dialog({
    height: 500,
    width: 500
});

編輯:如果你能給我們一些關於你為什么要實現這個目標的更多細節,我們可能會給你其他選擇。

您可以將其設置為全局變量:

var window.sizeRelatedOptions = { // now it's a global

最好讓你的匿名函數返回變量,但是:

var myvar = (function( $, undefined ) {

  var sizeRelatedOptions = {
    buttons: true,
    height: true,
    //etc
  };
  var returnvar = sizeRelatedOptions; // in case sizeRelatedOptions is modified

  $.widget( "ui.dialog", {
      //widget code
  });

  return returnvar;

}( jQuery ) ); // now myvar contains the same data

將窗口對象傳遞給函數,然后可以將方法和屬性附加到它。

(function( $, window, undefined ) {

    window.sizeRelatedOptions = {
        buttons: true,
        height: true,
        //etc
    }

    $.widget( "ui.dialog", {
        //widget code
    });

}( jQuery, window ) );

您應該在全局范圍內聲明此變量。 您可以使用$ .extend向現有對象添加屬性。

window.sizeRelatedOptions  = {};

(function( $, undefined ) {
    $.extend(sizeRelatedOptions ,  {
        buttons: true,
        height: true,
        //etc
    });

    $.widget( "ui.dialog", {
        //widget code
    });
}( jQuery ) );
var accessor = (function( $, undefined ) {

    var sizeRelatedOptions = {
        buttons: true,
        height: true,
        //etc
    }

    $.widget( "ui.dialog", {
        //widget code
    });
    return {
       getSizeRelatedOptions: function () { return sizeRelatedOptions; }
    }
}( jQuery ) );
accessor.getSizeRelatedOptions();

我不認為沒有修改小部件的來源是可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM