我正在研究一个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未定义'。我不确定我做错了什么。
答案 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
放在rotate
和ksana
的范围内 - 即在您的根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)));
};