这种自我调用匿名函数变体背后的原因

Sea*_*lan 25 javascript module anonymous-function commonjs coffeescript

在github上查看代码时,我发现了以下内容:

(function() {

}).call(this);
Run Code Online (Sandbox Code Playgroud)

这显然是一个自我调用的匿名函数.但为什么这样写呢?我习惯于看到规范的变体(function() {})().

使用.call(this)自动调用匿名函数有什么特别的优势吗?


编辑:看起来某些commonjs环境this在模块的顶层设置为非全局值.哪些,以及它们this可能想要保留的内容是什么?

use*_*716 26

默认情况下,调用函数(function(){/*...*/})()会将函数中的值设置thiswindow(在浏览器中),而不管this创建函数的封闭上下文中的值是什么.

使用call允许您手动将值设置为this您想要的任何值.在这种情况下,它将其设置this为封闭上下文中的值.

举个例子:

var obj = {
    foo:'bar'
};

(function() {
    alert( this.foo ); // "bar"
}).call( obj );
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/LWFAp/

您可以看到我们能够手动设置变量this引用的对象的obj值.


mat*_*tyr 6

.call(this)(实际上()直到我更改它)确保您的顶级this通过严格模式,--bare选项和/或运行环境(顶级this不指向全局对象)保持一致.

  • 这些都没有任何意义. (17认同)
  • 在松散模式下,如果调用没有对象的函数,则`this`设置为`window`.在严格模式下,`this`设置为`undefined`.使用`.call(this)`显式地将`this`(在函数内)设置为`this`(在函数外部),从而确保它保持为`window`,无论你是处于严格还是松弛模式. (12认同)
  • 啊 - `()`和`.call(this)`在严格模式下是不同的.现在一切都有道理.`.call(this)`为函数提供相同的上下文是严格和宽松的模式. (8认同)