2

我正在尝试编写一个简单的 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));

为什么这个函数被包裹在 () 和 (document) 最后被拍打?我以前没见过这个 JavaScript 魔法。

感谢您的任何意见。

4

3 回答 3

7

这是一个document作为参数传递的自执行函数。

这可以重写为:

var myFunc = function(d) {
    // code here
};

myFunc(document);
于 2013-07-31T20:21:53.427 回答
1

您可以使用此语法创建一个闭包,该闭包将传入的值(document)作为函数参数的参数。这种风格通常用于这样的事情:

for (var x = 0; x < 10; x++) {
  (function(y) {
    $.ajax({ params: {value: y}})...
  })(x);
}

它的作用是允许您将一组特定的值强制到该上下文中,当您希望循环的特定值可用于从该迭代进行的 ajax 调用时,这特别有用。

于 2013-07-31T20:22:25.470 回答
1

JavaScript 有一个称为隐含全局变量的特性。每当使用名称时,解释器都会向后遍历作用域链,寻找该名称的 var 语句。如果没有找到,则假定该变量是全局变量。如果在分配中使用它,则如果它不存在,则创建全局。这意味着在匿名闭包中使用或创建全局变量很容易。不幸的是,这会导致代码难以管理,因为(对人类而言)哪些变量在给定文件中是全局变量并不明显。

幸运的是,我们的匿名函数提供了一个简单的替代方案。通过将全局变量作为参数传递给我们的匿名函数,我们将它们导入到我们的代码中,这比隐含的全局变量更清晰、更快捷。这是一个例子:

引自:https ://stackoverflow.com/a/15777654/3086

于 2013-07-31T20:23:29.560 回答