2010-05-28 33 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