自执行的匿名函数约定

Self-executing anonymous function conventions

本文关键字:函数 约定 执行      更新时间:2023-09-26

以下两者有什么区别吗?它们都以相同的方式工作吗?

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

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

前两个是相同的,只是风格不同*;最后一个不同之处在于它使您能够控制 IIFE 中this的值。 例如

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

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


*当然,道格拉斯·克罗克福德有偏好

()内部或外部的()位置丝毫不重要。(很多)在另一个问题上进行了更多讨论,但这个问题并没有解决您提出的call选项。

根据规范,call至少需要一个参数,因此要与前两个选项大致相同,您需要:

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

。可以肯定的是,某些实现不会因为不提供参数而对你感到遗憾。

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

不过,1 和 2 之间没有区别。