29

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

(function() {

}).call(this);

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

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


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

4

5 回答 5

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

于 2011-06-09T02:47:09.627 回答
7

.call(this)(实际上只是()在我更改它之前)确保您的顶层this通过严格模式、--bare选项和/或运行环境(其中顶层this不指向全局对象)保持一致。

于 2011-06-09T09:08:34.620 回答
0

通过使用:

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

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

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

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

于 2011-06-09T02:53:12.270 回答
0
C={
    descript: "I'm C!<br>",
    F: function() {
        //set this to the caller context's 'this'
        (function() {
            document.write(this.descript);
        }).call(this);

        //set this to 'window' or 'undefined' depend the mode
        (function() {
            document.write(this.descript);
        })();

        //member function's 'this' is the object self
        document.write(this.descript);
    }
}

window.descript="I'm window!<br>";

C.F();

(function() {}).call(this);可以将this匿名设置为调用者上下文this,在上面是C(function() {})();将设置thiswindowundefined取决于模式。

于 2015-08-27T08:00:24.317 回答
-3

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

于 2012-06-10T15:00:38.520 回答