从外部访问匿名函数内的变量

时间:2013-08-14 13:41:10

标签: javascript jquery jquery-ui

jquery-ui对话框小部件被包装(就像所有其他小部件一样)在匿名函数中。

在此函数内部有一个名为sizeRelatedOptions的变量。我需要从包装闭包外部向该对象添加一个键。实现这一目标的最佳方法是什么?

(function( $, undefined ) {

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

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

}( jQuery ) );

编辑#1:上面的代码是jQuery ui的source code

编辑#2 :我现在明白我不能简单地访问该变量。所以我必须解决这个问题。因此,这里有一些关于我为什么需要这个的更多信息:

我正在扩展jQuery ui的对话框小部件以添加另一个buttonPane。为了在窗格添加到窗口小部件后使窗口小部件自行调整大小,我想向sizeRelatedOption添加一个选项。 (这就是这个问题的第一个问题。)因为对话框小部件的_options函数会检查sizeRelatedOption中的选项是否存在作为键。在这种情况下,它会调用_size函数来调整窗口小部件的大小。

希望我有点清楚。

5 个答案:

答案 0 :(得分:2)

你不能不直接修改源代码,但这不是你应该考虑的选项,因为这是一个非常糟糕的做法,原因很多。

该变量对该范围是私有的,除非该对象使其可以公开访问,否则您的代码必须在声明变量才能访问它的同一范围或子范围内运行。

但是,如果您尝试更改某些配置选项,则窗口小部件已为此提供API

例如,

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

编辑:如果你能给我们一些关于你为什么要实现这个目标的更多细节,我们可能会给你其他选择。

答案 1 :(得分:0)

您可以将其设置为全局变量:

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

答案 2 :(得分:0)

将窗口对象传递给函数,然后可以将方法和属性附加到它。

(function( $, window, undefined ) {

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

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

}( jQuery, window ) );

答案 3 :(得分:0)

您应该在全局范围内声明此变量。 您可以使用$.extend向现有对象添加属性。

window.sizeRelatedOptions  = {};

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

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

答案 4 :(得分:0)

var accessor = (function( $, undefined ) {

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

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

如果不修改小部件的来源,我认为这是不可能的。