在查看github上的代码时,我发现了以下内容:
(function() {
}).call(this);
这显然是一个自调用匿名函数。但是为什么会这样写呢?我习惯于看到规范变体(function() {})()
。
.call(this)
使用自调用匿名函数有什么特别的优势吗?
编辑:看起来一些 commonjs 环境this
在模块的顶层设置为非全局值。哪些,以及它们设置this
为您可能想要保留的内容?
在查看github上的代码时,我发现了以下内容:
(function() {
}).call(this);
这显然是一个自调用匿名函数。但是为什么会这样写呢?我习惯于看到规范变体(function() {})()
。
.call(this)
使用自调用匿名函数有什么特别的优势吗?
编辑:看起来一些 commonjs 环境this
在模块的顶层设置为非全局值。哪些,以及它们设置this
为您可能想要保留的内容?
默认情况下,调用类似的函数(function(){/*...*/})()
会将函数this
中的值设置为window
(在浏览器中),而不管this
创建函数的封闭上下文中的值如何。
使用call
允许您手动将值设置this
为您想要的任何值。在这种情况下,它将其设置为this
封闭上下文中的任何值。
举个例子:
var obj = {
foo:'bar'
};
(function() {
alert( this.foo ); // "bar"
}).call( obj );
您可以看到我们能够手动将 的值设置为变量this
引用的对象obj
。
.call(this)
(实际上只是()
在我更改它之前)确保您的顶层this
通过严格模式、--bare
选项和/或运行环境(其中顶层this
不指向全局对象)保持一致。
通过使用:
> (function() {
> ...
> }).call(this);`
然后将代码范围内的this(可能是全局对象)设置为函数的this对象。据我所知,它相当于:
(function(global) {
// global references the object passed in as *this*
// probably the global object
})(this);
在浏览器中,通常window是(或表现得好像是)全局对象的别名。
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() {})();
将设置this
为window
或undefined
取决于模式。
自调用函数对于在加载脚本时立即执行其内容很有用。这便于初始化全局范围元素。