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

时间:2011-06-09 02:37:28

标签: javascript module anonymous-function coffeescript commonjs

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

(function() {

}).call(this);

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

使用.call(this)进行自调用匿名函数有什么特别的好处吗?


编辑:看起来有些commonjs环境将this设置为模块顶层的非全局值。哪些,以及他们将this设置为您可能要保留的内容?

4 个答案:

答案 0 :(得分:26)

默认情况下,调用(function(){/*...*/})()之类的函数会将函数中this的值设置为window(在浏览器中),而不管this的值是多少可能在创建函数的封闭上下文中。

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

举个例子:

var obj = {
    foo:'bar'
};

(function() {
    alert( this.foo ); // "bar"
}).call( obj );

http://jsfiddle.net/LWFAp/

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

答案 1 :(得分:5)

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

答案 2 :(得分:0)

使用:

> (function() {
>   ...
> }).call(this);`

然后将代码范围内的(全局对象的probaby)设置为函数的 this 对象。据我所知,它相当于:

(function(global) {
  // global references the object passed in as *this*
  // probably the global object
})(this);

在浏览器中,通常 window 是(或表现得像)全局对象的别名。

答案 3 :(得分:-3)

自动调用函数对于在加载脚本时立即执行其内容非常有用。这可以方便地初始化全局范围元素。