代码之家  ›  专栏  ›  技术社区  ›  meo

为什么环球航空公司不好?

  •  12
  • meo  · 技术社区  · 14 年前

    我在这里使用它完全有意义。 另一种选择是什么?一般来说,我怎样才能避免使用它们,最重要的是,根据jslint的说法,使用globals是不好的。

    (function($){
      $(function(){
       $body = $('body'); //this is the BAD Global
    
       $.each(somearray ,function(){ $body.dosomething() });
    
       if (something){
         $body.somethingelse();
       }
    
      });
    }(jQuery));
    

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

    5 回复  |  直到 14 年前
        1
  •  18
  •   Aaron Digulla    14 年前

    全球经济形势不好,因为它们不会马上造成问题。只有到了以后,在你到处使用它们之后,它们会导致非常难看的问题——如果不从头开始编写代码,你就无法解决这些问题。

    示例:您使用 $body 定义一些函数。那很好。但最终,您还需要一个值。所以你用 $body.foo . 工作良好。然后添加 $body.bar . 然后,几周后,你需要另一个价值,所以你要 $ Bo.Bar .

    您测试了代码,它似乎可以工作。但实际上,您已经“添加”了同一个变量两次。这没问题,因为javascript不理解“一次创建一个新变量”的概念。它只知道“除非已经存在,否则创建”。因此,使用代码,最终,一个函数将修改 $ Bo.Bar 破坏另一个功能。即使是找到问题也需要很多时间。

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

        2
  •  2
  •   mpapis    14 年前

    您应该用var$body定义它,然后它将是该函数范围内的本地变量,如果没有var,它将被所有人覆盖。

    (function($){
      $(function(){
       var $body = $('body'); //this is the local variable
    
       $.each(somearray ,function(){ $body.dosomething() });
    
       if (something){
         $body.somethingelse();
       }
    
      });
    }(jQuery));
    
        3
  •  2
  •   pex    14 年前

    全局变量可能与其他脚本冲突或被覆盖。当你不需要全球化时,最好避免全球化。简单使用 var (或) let 如果您的JS版本支持大于1.7):

    (function() {
      var foo = 'bar';
      alert(foo);
    })();
    
        4
  •  2
  •   David Hedlund    14 年前

    你可以把它改写为

    var $body = $('body');
    

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

    使用globals不好的原因是它可以被其他任何东西覆盖。为了使代码能够很好地伸缩,它将依赖于您使用的其他脚本。最好保持脚本尽可能自给自足,尽可能少地依赖于它之外的世界。

        5
  •  0
  •   kizzx2    14 年前

    jslint非常严格。可能没必要对这件事太过火。

    但是如果你感觉不好,你可以像你观察的那样做。 jQuery :

    (function($){
      $(function(){
       $.each(somearray ,(function($body){ $body.dosomething() })($('body'));
    
       if (something){
         $('body').somethingelse();
       }
    
      });
    }(jQuery));