代码之家  ›  专栏  ›  技术社区  ›  Sedat Kapanoglu johnnywhoop

为什么要在函数定义调用对中编写全局代码?

  •  6
  • Sedat Kapanoglu johnnywhoop  · 技术社区  · 14 年前

    我看到一些示例,其中包括jQuery和jslint在内的JavaScript代码使用以下表示法:

    (function(){
      // do something
    })();
    

    // do something
    

    我首先认为这只是局部作用域,即为代码块创建局部变量而不污染全局名称空间。但我也见过没有任何局部变量的实例。

    我错过了什么?

    5 回复  |  直到 14 年前
        1
  •  8
  •   Dan Heberden    14 年前

    它也涉及函数的作用域—代码块中声明的所有内容都只限于该匿名函数。事情通常是由框架公开的

    (function($) {
    
      var localVarOnly = "local";
    
      $.fn.myCoolFunction = function() { // in the case of jquery, make this publicly available
        otherCoolFunction(); //alerts hi
        alert(localVarOnly); // alerts local
      };
    
      function otherCoolFunction() { // scoped to this anonymous function only
        alert('hi');
      };
    
    })(jQuery);
    
    otherCoolFunction(); // undefined
    alert(localVarOnly); // undefined
    
        2
  •  4
  •   nickf    14 年前

    正如其他人所说,这几乎完全与创建本地范围有关。另一个好处是,您可以使用它来(因为缺少更好的词)“重命名”变量。举个例子,几个javascript框架如何使用 $ $ ,您可以将其用作参数,其内部可以是您想要的任何内容:

    // out here $ might be Prototype, something else, or even undefined
    (function($) {
        // in here, $ is jQuery
    })(jQuery);
    

    另外一个小技巧是使用同样的技术来创建一个未定义的变量。大多数人认为 undefined 在javascript中是一个特殊的关键字,但实际上它只是作为一个普通变量处理,您希望没有人会定义它。检查未定义变量的标准做法:

    if (x == undefined)
    

    …实际上相当浪费,因为它检查整个作用域链中名为“undefined”的变量。要设置快捷方式,可以使用以下方法:

    (function($, undefined) {
        // code here
    })(jQuery);  // note that there's just one parameter passed
    

    既然 实际上在一个作用域中(具有未定义的值),检查作用域链可以在该点停止。微观优化,是的,但知道了也没什么坏处。

        3
  •  3
  •   Brian Moeskau    14 年前

    这种语法是创建局部作用域,正如其他人所评论的,但是 . 请注意,简单地创建本地作用域也可以这样完成:

    var foo = function(){
       // local code
    };
    foo();
    

    但是,如果您只做了这些,而foo除了调用一次之外没有其他实用程序,那么匿名、自动执行的语法只会为您节省额外的var声明:

    (function(){
       // local code
    })();
    

    在使用OOP模式的框架中,这也是用于创建单例的语法,因为函数只能运行一次,外部代码不能再次调用它。

        4
  •  3
  •   petabyte    14 年前

        5
  •  1
  •   Sean Kinsey    14 年前

    这是为了创建一个包含所有声明变量的范围。这是为了避免污染全局范围并避免重写已经存在的变量。

    举个例子

    (function() {
        var foo = "bar";
        var undefined = true;
        var bar = true;
    
        alert(foo); //bar
        if (bar == undefined) {
            alert("bar is undefined.. not!"); //will show even though we know that bar is not 'undefined'
        }
    
    })();
    
    var bar = true;
    alert(foo) //undefined
    if (bar == undefined) {
        alert("bar is undefined"); // will not be called
    }
    

    说到图案, (function(){/*....*/})(); comp.lang.javascript 关于这个构造的名称,以及谁应该得到它的信任:)