自执行匿名函数约定

时间:2014-12-17 16:58:22

标签: javascript

以下是否有任何区别?他们都以同样的方式工作吗?

我已经看到.call()的某些用例,但我从未见过关于为什么函数调用括号在匿名函数声明之内或之后的解释。

(function() {

}());
 ^^
(function() {

})();
  ^^
(function() {

}).call();

3 个答案:

答案 0 :(得分:3)

前两个是相同的,只有风格不同*;最后一个是不同的,因为它使你能够控制this在IIFE内的价值。例如

(function(){
    this.a = 12;
}).call(foo);

会将属性a添加到对象foo。


*当然道格拉斯·克罗克福德has a preference

答案 1 :(得分:2)

()位于主()内部或外部的位置无关紧要。 (更多)讨论in this other question,但该问题并未涉及您提出的call选项。

call至少需要一个参数according to the specification,因此要与前两个选项大致相同,您需要:

(function() {
}).call(undefined);

...确保某些实现不会因为不提供参数而感到高兴。

答案 2 :(得分:0)

我更喜欢第二种方式。 JSLint使用第一种方式。您应该始终将.call()与参数一起使用,因此第三个变体是错误的。

虽然1和2之间没有区别。