我的查询用于“(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"
];
...
谢谢。
答案 0 :(得分:24)
这样做是为了避免命名冲突。
声明函数时,该函数有自己的变量名称空间。通过将代码包装在立即调用的函数中,可以避免使用自己的值覆盖全局变量。
在这种情况下,s
和sc
会分配一个值。如果您在全局范围内执行此操作,并且其他脚本已将这些名称的变量用于不同目的,则会导致其他脚本失败。通过引入新范围,标识符s
和sc
现在引用不同的(本地绑定的)变量,而不是存在于全局范围内的名为s
和sc
的变量
答案 1 :(得分:6)
也许这些问题可以帮到你:
答案 2 :(得分:3)
(function() {...})();
是一个自我调用的匿名函数,即一个没有名字的函数,可以立即执行。由于JavaScript具有函数作用域,因此使用自调用匿名函数会将函数内部的变量范围限制为函数本身,从而避免可能发生的任何冲突。
在jQuery中,插件authers经常使用一个自调用的匿名函数来引用函数内部带有$
符号的jQuery对象。例如
(function($) {
/* plugin code here */
})(jQuery);
答案 3 :(得分:2)
成语(function() {...})();
限制变量的范围。因此,在第一种情况下,s
(和sc
,tp
等)将无法在函数体外的任何位置访问。在第二种情况下,您将能够访问它。所以(function() {...})();
可以防止命名空间污染。你是否需要那个是另一个问题。你可能想谷歌像“范围JavaScript”。有一个很好的article。