【问题标题】:How do I scope variables properly in jQuery?如何在 jQuery 中正确定义变量的范围?
【发布时间】:2010-05-28 20:38:57
【问题描述】:

我正在开发一个 jQuery 插件,但在正确设置变量范围时遇到了一些麻烦。这是我的代码中的一个示例:

(function($) {

$.fn.ksana = function(userOptions) {
    var o = $.extend({}, $.fn.ksana.defaultOptions, userOptions);

    return this.each(function() {
        alert(rotate()); // o is not defined
    });
};

function rotate() {
    return Math.round(o.negRot + (Math.random() * (o.posRot - o.negRot)));
};

$.fn.ksana.defaultOptions = {
    negRot: -20,
    posRot: 20
};

})(jQuery);

我试图让私有函数 rotate 能够看到 o 变量,但它只是不断提醒“o 未定义”。我不确定我做错了什么。

【问题讨论】:

    标签: javascript jquery scope


    【解决方案1】:

    o 变量在 $.fn.ksana 函数内的局部范围内,为了允许 rotate 访问它,您应该:

    • 只需将o 变量作为参数传递给它。
    • ksana 中定义该函数。
    • 在外部范围内定义o

    IMO,将其作为参数传递就足够干净了:

    (function($) {
      $.fn.ksana = function(userOptions) {
        var o = $.extend({}, $.fn.ksana.defaultOptions, userOptions);
    
        return this.each(function() {
            alert(rotate(o)); // pass o
        });
      };
    
      function rotate(o) { // use passed object
        return Math.round(o.negRot + (Math.random() * (o.posRot - o.negRot)));
      }
    //...
    })(jQuery);
    

    【讨论】:

    • +1 由于您没有在插件外部公开rotate,因此不妨将变量作为参数传入以避免出现不必要的全局状态。
    • 这可能是一个愚蠢的问题,但这不会产生额外的开销吗?我将有很多需要访问 o 的函数,所以我会经常传递 o...
    • @safetycopy:好吧,您可以将o 暴露给更多功能,就像我在第三种方法中所说的那样,在封闭范围内定义o
    • 那么,看起来像:(function($) { var o = null; $.fn.ksana = function(userOptions) { o = $extend({}, $.fn.ksana.defaultOptions, userOptions); 对吗?
    • @safetycopy: 对了,顺便说一句,你真的不需要指定null(除非你特别想要),如果你不指定任何东西,即var o; o 将包含undefined,还有你在函数声明之后的don't need semicolons(就像你原来的帖子中的rotate)。
    【解决方案2】:

    您必须将 o 放在 rotateksana 周围的范围内 - 即在您的根 function($) 范围内。像这样:

    (function($) {
    
    var o;
    
    $.fn.ksana = function(userOptions) {
       o = $.extend({}, $.fn.ksana.defaultOptions, userOptions);
    

    但是你为什么不把它作为rotate 的参数呢?为什么你需要让它有点“全球性”?

    【讨论】:

    • o 从用户和默认选项合并。如果它在根函数的范围内,我认为我无法实现。
    【解决方案3】:

    您可以将 rotate-function 放在与 o 相同的范围内:

    (function($) {
    
    $.fn.ksana = function(userOptions) {
        var o = $.extend({}, $.fn.ksana.defaultOptions, userOptions);
    
        function rotate() {
            return Math.round(o.negRot + (Math.random() * (o.posRot - o.negRot)));
        };
    
        return this.each(function() {
            alert(rotate()); 
        });
    };
    

    或者,只需将其传递给旋转:

    (function($) {
    
        var o;
        $.fn.ksana = function(userOptions) {
            o = $.extend({}, $.fn.ksana.defaultOptions, userOptions);
    
            return this.each(function() {
               alert(rotate(o)); 
            });
        };
    
    function rotate(o) {
        return Math.round(o.negRot + (Math.random() * (o.posRot - o.negRot)));
    };
    

    【讨论】:

    • 将旋转功能移动到与o保持旋转私有相同的范围内吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多