我正在尝试编写一个简单的Facebook应用程序。在我需要的代码中,我发现了这个:
// Load the SDK asynchronously
(function(d){
var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
ref.parentNode.insertBefore(js, ref);
}(document));
为什么这个函数被包装在()中并且(文档)在最后被打了? 我以前没见过这种JavaScript法术。
感谢您的任何意见。
答案 0 :(得分:7)
这是一个自我执行的函数,它将document
作为参数传递。
这可以改写为:
var myFunc = function(d) {
// code here
};
myFunc(document);
答案 1 :(得分:1)
您可以使用此语法创建一个闭包,该闭包具有在(document)
中传递的值作为函数参数的参数。这种风格通常用于这样的事情:
for (var x = 0; x < 10; x++) {
(function(y) {
$.ajax({ params: {value: y}})...
})(x);
}
它的作用是允许你强制一组特定的值进入该上下文,当你希望循环的特定值可用于从该迭代进行的ajax调用时,这特别有用。
答案 2 :(得分:1)
JavaScript有一个称为隐含全局变量的功能。每当使用名称时,解释器向后遍历作用域链,寻找该名称的var语句。如果未找到,则假定该变量是全局变量。如果它在赋值中使用,则创建全局(如果尚不存在)。这意味着在匿名闭包中使用或创建全局变量很容易。不幸的是,这导致了难以管理的代码,因为对于给定文件中哪些变量是全局的并不明显(对于人类而言)。
幸运的是,我们的匿名功能提供了一个简单的选择。通过 将globals作为参数传递给我们的匿名函数,我们导入 将它们放入我们的代码中,这比隐含的更清晰,更快捷 全局。这是一个例子: