在这里使用它对我来说是完全有意义的。 会有什么选择?我怎么能完全避免使用它们,而且最重要的是根据jsLint使用全局变量的原因很糟糕。
(function($){
$(function(){
$body = $('body'); //this is the BAD Global
$.each(somearray ,function(){ $body.dosomething() });
if (something){
$body.somethingelse();
}
});
}(jQuery));
你能帮我理解一下吗?并给我一个更好的解决方案?
答案 0 :(得分:18)
Globals很糟糕,因为它们不会立即引起问题。只有到了以后,在你到处使用它们之后,它们才会引起非常难看的问题 - 如果不从头编写代码,你就无法解决这些问题。
示例:您使用$body
来定义某些功能。这很好。但最终,你还需要一个价值。所以你使用$body.foo
。工作良好。然后添加$body.bar
。然后,几周后,您需要另一个值,以便添加$body.bar
。
您测试代码,它似乎工作。但事实上,你已经“添加”了两次相同的变量。这不是问题,因为JavaScript不理解“一次创建一个新变量”的概念。它只知道“创建,除非它已经存在”。所以你使用你的代码,最终,一个函数将修改$body.bar
打破另一个函数。即使找到问题也会花费你很多时间。
这就是为什么最好确保变量只能在需要的基础上看到。这样,一个功能不能打破另一个功能。随着代码的增长,这变得更加重要。
答案 1 :(得分:2)
你应该用var $ body定义它,然后它将是该函数范围内的本地,没有var它可以被所有人覆盖
(function($){
$(function(){
var $body = $('body'); //this is the local variable
$.each(somearray ,function(){ $body.dosomething() });
if (something){
$body.somethingelse();
}
});
}(jQuery));
答案 2 :(得分:2)
全局变量可能会与其他脚本发生冲突或被覆盖。当您不需要全局时,建议避免它们。如果您的JS-Version-Support大于1.7,只需使用var
(或let
):
(function() {
var foo = 'bar';
alert(foo);
})();
答案 3 :(得分:2)
您可以将其重写为
var $body = $('body');
那(使用var
关键字)会使它成为一个局部变量,这足以满足您的需要。它仍然在您each
回调的范围内。
使用全局变量的原因是它可以被其他任何东西覆盖。为了使您的代码能够很好地扩展,它将依赖于您使用的其他脚本。最好保持脚本尽可能自给自足,尽可能少地依赖指向它之外的世界。
答案 4 :(得分:0)
jsLint非常严格。可能没有必要对此过于笼罩。
但如果你感觉不好,你就可以像jQuery
:
(function($){
$(function(){
$.each(somearray ,(function($body){ $body.dosomething() })($('body'));
if (something){
$('body').somethingelse();
}
});
}(jQuery));