为什么全局变量不好?

时间:2010-11-22 14:17:39

标签: javascript

在这里使用它对我来说是完全有意义的。 会有什么选择?我怎么能完全避免使用它们,而且最重要的是根据jsLint使用全局变量的原因很糟糕。

(function($){
  $(function(){
   $body = $('body'); //this is the BAD Global

   $.each(somearray ,function(){ $body.dosomething() });

   if (something){
     $body.somethingelse();
   }

  });
}(jQuery));
你能帮我理解一下吗?并给我一个更好的解决方案?

5 个答案:

答案 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));