为什么他们用匿名函数包装代码并立即调用它而不是简单地执行相同的代码?

时间:2014-08-14 13:08:47

标签: javascript

调查一些.html文件我发现了有趣的JavaScript构造:

<script>
...
ga(
  function(tracker) {
    (
      function(w, d, c) {
        $.getScript(
          ('https:' == d.location.protocol ? 'https://' : 'http://') + "service.com/script.js?param;client_id"+c+";ref" + escape(d.referrer) + ";url" + escape(d.URL) + ";cook" + escape(d.cookie)
        );
      }
    ) (window, document, tracker.get('clientId'));
  }
);
</script>

有一些函数'ga'将函数作为输入参数,将来会对它做些什么。

问题是关于该匿名函数的主体。为什么他们创建了一个更多的内部匿名函数并立即调用它而不是像这样执行相同的代码:

<script>
...
ga(
  function(tracker) {
    // I have changed d -> document, c -> tracker.get('clientId')
    $.getScript(
      ('https:' == document.location.protocol ? 'https://' : 'http://') + "service.com/script.js?param;client_id"+tracker.get('clientId')+";ref" + escape(document.referrer) + ";url" + escape(document.URL) + ";cook" + escape(document.cookie)
    );
  }
);
</script>

2 个答案:

答案 0 :(得分:2)

背后可能有几个原因。

一个原因是简化单个表达式的多次使用。例如,在您的代码段中,您必须多次使用document,而原始代码要短得多,因为内部函数对变量使用1个字母的长名称。 如果您必须在代码的一小部分中多次使用更长的表达式,这将变得更加重要。

答案 1 :(得分:2)

如果您正在寻找一般使用功能的理由,那么阿里的答案可能是正确的答案。但你所说的Alexey Ruzin我认为是封闭的。这些方面的东西:

(function called(arguments){
    // statements here
})();

这样做是为了保护数据及其范围。所以你知道你的变量只能在范围内使用。

希望它有所帮助。