代码之家  ›  专栏  ›  技术社区  ›  andres descalzo

我应该何时使用语法“(function()…)();”?

  •  8
  • andres descalzo  · 技术社区  · 15 年前

    我的查询用于“(function()…)();”假设我不是插件的情况。 例如“ http://piecesofrakesh.blogspot.com/2009/03/downloading-javascript-files-in.html

    (function() {        
      var s = [
        "/javascripts/script1.js",
        "/javascripts/script2.js"
      ];
    
      var sc = "script", tp = "text/javascript", sa = "setAttribute", doc = document, ua = window.navigator.userAgent;
    
      for(var i=0, l=s.length; i<l; ++i) {
        if(ua.indexOf("MSIE")!==-1 || ua.indexOf("WebKit")!==-1) {
          doc.writeln("<" + sc + " type=\"" + tp + "\" src=\"" + s[i] + 
              "\" defer></" + sc + ">");
        } else {
          var t=doc.createElement(sc);
          t[sa]("src", s[i]);
          t[sa]("type", tp);
          doc.getElementsByTagName("head")[0].appendChild(t);
        }
      }
    })();
    

    var s = [
        "/javascripts/script1.js",
        "/javascripts/script2.js"
    ];
    ...
    

    谢谢您。

    4 回复  |  直到 15 年前
        1
  •  24
  •   rix0rrr    15 年前

    这样做是为了避免命名冲突。

    当您声明一个函数时,该函数有自己的变量名称空间。通过将代码包装在一个立即调用的函数中,可以避免用自己的值覆盖全局变量。

    在这种情况下 s sc 分配了一个值。如果您在全局范围内这样做,并且其他脚本已经在使用具有这些名称的变量来实现不同的目的,这将导致其他脚本失败。通过引入新的作用域,标识符 S 现在引用的变量不同于 S 存在于全球范围内。

        3
  •  3
  •   Russ Cam    15 年前

    (function() {...})(); 是一个自调用的匿名函数,即一个没有名字的函数,直接执行。由于JavaScript具有函数作用域,因此使用自调用匿名函数将函数内部变量的作用域限制为函数本身,从而避免可能发生的任何冲突。

    在jquery中,插件授权人员经常使用自调用匿名函数来引用jquery对象。 $ 函数内部的符号。例如

    (function($) {
    
        /* plugin code here */
    
    })(jQuery);
    
        4
  •  2
  •   Rorick    15 年前

    成语 (function() {...})(); 限制变量的范围。所以在第一种情况下 s (和) sc , tp 等)在功能体之外的任何地方都无法访问。在第二种情况下,您可以访问它。所以 (function()…)(); 防止命名空间污染。你是否需要这是另一个问题。你可能喜欢用谷歌搜索“scope-javascript”。有一个不错的 article .