我什么时候应该使用语法“(function(){...})();”?

时间:2009-07-31 13:11:58

标签: javascript

我的查询用于“(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 个答案:

答案 0 :(得分:24)

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

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

在这种情况下,ssc会分配一个值。如果您在全局范围内执行此操作,并且其他脚本已将这些名称的变量用于不同目的,则会导致其他脚本失败。通过引入新范围,标识符ssc现在引用不同的(本地绑定的)变量,而不是存在于全局范围内的名为ssc的变量

答案 1 :(得分:6)

答案 2 :(得分:3)

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

在jQuery中,插件authers经常使用一个自调用的匿名函数来引用函数内部带有$符号的jQuery对象。例如

(function($) {

    /* plugin code here */

})(jQuery);

答案 3 :(得分:2)

成语(function() {...})();限制变量的范围。因此,在第一种情况下,s(和sctp等)将无法在函数体外的任何位置访问。在第二种情况下,您将能够访问它。所以(function() {...})();可以防止命名空间污染。你是否需要那个是另一个问题。你可能想谷歌像“范围JavaScript”。有一个很好的article