2010-05-28 78 views
1

我正在研究一个jQuery插件,但在正确使用我的变量时遇到了一些麻烦。下面是我的代码示例:如何在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); 

我试图让私有函数旋转,以便能够看到O变量,但它只是不断提醒“O没有定义”。我不确定我做错了什么。

回答

6

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); 
+0

+1既然你不暴露'旋转'在插件外部,不妨将变量作为参数传递,以避免产生不必要的全局状态。 – R0MANARMY 2010-05-28 20:45:10

+0

这可能是一个愚蠢的问题,但不会产生额外的开销?我将会有很多需要访问o的函数,所以我会把o传递给很多... – safetycopy 2010-05-28 20:52:58

+0

@safetycopy:那么,你可以将'o'暴露给更多的函数,就像我说的我的第三种方法是在封闭范围内定义“o”。 – CMS 2010-05-28 20:57:03

2

你必须把o在被周围的两个rotateksana范围 - 在你的根function($)范围即。像这样:

(function($) { 

var o; 

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

但是,你为什么不把它作为rotate的参数?为什么你需要使它成为“全球”?

+0

o是从用户和默认选项合并而来的。如果它在根函数的范围内,我认为我不能实现这一点。 – safetycopy 2010-05-28 20:54:08

2

您可以把旋转功能在相同的范围内○:

(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))); 
}; 
+0

将旋转函数移动到与保持旋转私有相同的范围? – safetycopy 2010-05-28 20:55:34