【问题标题】:Javascript function has (document) slapped on at the end? [duplicate]Javascript 函数最后被(文档)打了? [复制]
【发布时间】:2013-08-01 13:12:19
【问题描述】:

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

感谢您的任何意见。

【问题讨论】:

  • 这是一个以文档为参数的匿名函数
  • @koala_dev 这可能是一个答案..
  • 是的,我现在看到这是一个非常相似的问题,但它的措辞很奇怪,我无法在搜索中找到该问题。
  • 这是创建一个函数并立即带一个参数。那为什么起作用呢,你可能会问?不要用 var js, id ... 等函数内部结构污染全局命名空间。

标签: javascript


【解决方案1】:

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

这可以重写为:

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

myFunc(document);

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 不知道我应该标记为重复还是只回答参考。请根据需要进行编辑。
      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2011-12-05
      • 2019-09-16
      相关资源
      最近更新 更多