为什么全局变量不好?

IT技术 javascript
2021-02-27 21:08:51

在这里使用它对我来说完全有意义。什么是替代方案?我一般如何避免使用它们,最重要的是为什么根据 jsLint 使用全局变量是不好的。

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

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

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

  });
}(jQuery));

你能帮我理解这个吗?并给我一个更好的解决方案?

5个回答

全局变量很糟糕,因为它们不会立即引起问题。直到后来,在你到处使用它们之后,它们才会导致非常丑陋的问题——如果不从头开始编写代码,你就无法解决这些问题。

示例:您$body用来定义一些函数。这很好用。但最终,您还需要一个值。所以你使用$body.foo. 工作正常。然后你添加$body.bar. 然后,几周后,您需要另一个值,因此添加$body.bar.

你测试代码,它似乎工作。但实际上,您已经两次“添加”了相同的变量。这没有问题,因为 JavaScript 不理解“创建一个新变量一次”的概念。它只知道“除非它已经存在,否则创建”。所以你使用你的代码,最终,一个函数会修改$body.bar破坏另一个函数。即使找到问题也会花费你很多时间。

这就是为什么最好确保只能在需要时才能看到变量。这样,一个函数就不能破坏另一个函数。随着代码的增长,这变得更加重要。

你应该用 var $body 定义它,然后它在该函数的范围内是局部的,没有 var 它可以被每个人覆盖

(function($){
  $(function(){
   var $body = $('body'); //this is the local variable

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

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

  });
}(jQuery));
或者覆盖一些名为 $body 的“其他”全局变量
2021-04-20 21:08:51
使用在与函数定义相同的范围内声明的局部变量的函数字面量称为闭包,应该在 jQuery 中广泛使用以达到很好的效果。
2021-04-21 21:08:51
是的,但在这个例子中它会替换全局值,这样它只会将它隐藏在函数的范围内
2021-04-30 21:08:51

Globale 变量可能与其他脚本发生冲突或被覆盖。当您不需要全局变量时,建议避免使用它们。只需使用var(或者let如果您的 JS-Version-Support 大于 1.7):

(function() {
  var foo = 'bar';
  alert(foo);
})();

你可以把它改写为

var $body = $('body');

那(使用var关键字)将使其成为局部变量,这足以满足您的目的。它仍然在您的each回调范围内

使用全局变量不好的原因是它可以被其他任何东西覆盖。为了让您的代码能够很好地扩展,它取决于您使用的其他脚本。最好让脚本尽可能自给自足,尽可能少的依赖指向它之外的世界。

jsLint 非常严格。可能没有必要太挂断它。

但是如果你感觉不好,你可以像你的范围那样做jQuery

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

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

  });
}(jQuery));
我同意通常没有必要对 jsLint 所说的所有内容进行全部处理,但我不会在这种情况下提及这一点,因为我真的同意如果可以轻松避免全局变量,它们应该是,并且在这段代码中变量可以声明为局部变量,不需要其他操作。
2021-04-24 21:08:51