我看过这样写的JavaScript(它是在演示中,我手边没有实际代码,但暗示这是正常的):
(function() {
var a = 1;
this.sayA = function() {
alert(a);
}
}).call(this);
sayA();
我认为它是一个匿名函数,因此变量a
不是全局可用的。
.call(this)
有什么意义?由于此函数未嵌套,this
只是窗口。它与仅在最后写()
有什么不同?
答案 0 :(得分:33)
我对此感到好奇,以及我刚刚看到John Resig关于this video的讨论。 Yoshi有一个很好的答案,但我必须在控制台日志中稍微测试才能理解,我认为对他的回答的修改可能会帮助一些像我一样有困难的人:
function Foo() {
this.foo = true;
(function () {
console.log("Foo = " + this.foo);
// Outputs undefined
}());
(function () {
console.log("Foo = " + this.foo);
// Outputs true
}).call(this);
(function () {
console.log(this);
// Outputs undefined in strict mode, or Window in non strict mode
// Anonymous functions usually default to the global scope
})();
}
var bar = new Foo;
让我更有意义的是看到第一个和第二个并排,显示.call(this)本质上使你能够将当前上下文传递给匿名函数。
感谢您提出问题并感谢Yoshi的明确答复!
答案 1 :(得分:32)
试试这个:
function Foo() {
(function () {
console.log(this);
// > Foo
}).call(this);
(function () {
console.log(this);
// > undefined in strict mode, or Window in non strict mode
})();
}
var bar = new Foo;
所以,如果由于某种原因你使用它,这是一种使IIFE行为好像它是Foo
的成员函数的方法,特别是在创建用户定义的对象类型的实例时
答案 2 :(得分:13)
this
设置执行的上下文,因此在匿名函数this
中引用window
。
你可以写this.alert('');
。
答案 3 :(得分:13)
由于此功能未嵌套,
this
只是窗口。它与仅在最后写()
有什么不同?
不 - 不在strict mode:
- 如果功能代码是严格代码,请将
ThisBinding
设置为thisArg
。- 其他如果
thisArg
为null
或undefined
,请将ThisBinding
设置为全局对象。- ...
醇>
在严格模式下,this
只是直接设置为给定值,正常呼叫为undefined
。因此,.call(this)
用于显式传递全局对象。您可以在控制台中尝试:
> (function() { "use strict"; console.log(this); })()
undefined
> (function() { "use strict"; console.log(this); }).call(this)
Window
它可能对草率代码没有影响,但它是一个很好的做法和未来兼容: - )