Javascript函数有(文档)最后打了?

时间:2013-07-31 20:14:30

标签: javascript

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

感谢您的任何意见。

3 个答案:

答案 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作为参数传递给我们的匿名函数,我们导入   将它们放入我们的代码中,这比隐含的更清晰,更快捷   全局。这是一个例子:

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