如何在jQuery中正确调整变量范围?

时间:2010-05-28 20:38:58

标签: javascript jquery scope

我正在研究一个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未定义'。我不确定我做错了什么。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

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

(function($) {

var o;

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

但你为什么不把它作为rotate的论据呢?为什么你需要让它变得“全球化”?

答案 2 :(得分:2)

您可以将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)));
};