为什么在javascript匿名函数的末尾写上“.call(this)”?
我已经看到了这样写的JavaScript(这是一个演示,我没有实际的代码,但它暗示这是正常的):
(function() { var a = 1; this.sayA = function() { alert(a); } }).call(this); sayA();
我想这是写一个匿名函数,以便variablesa
不是全局可用的。
.call(this)
是什么? 由于这个函数没有嵌套, this
只是窗口。 它与最后只写()
什么不同?
尝试这个:
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
的成员函数一样,特别是在创build用户定义对象types的实例时。
我对此很好奇,以及我刚刚看到John Resig谈到这个video 。 Yoshi有一个很好的答案,但我不得不在控制台日志中进行testing以了解,我认为这个修改对他的回答可能会帮助一些像我这样有麻烦的人:
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)本质上使您能够将当前上下文传递给匿名函数。
谢谢你的问题,谢谢你明确的答案!
this
传递给函数设置执行的上下文,所以在你的匿名函数里面this
指的是window
。
你可以写this.alert('');
。
由于这个函数没有嵌套,
this
只是窗口。 它与最后只写()
什么不同?
否 – 不是严格模式 :
- 如果函数代码是严格代码,则将
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
它可能没有区别,但这是一个很好的做法和未来兼容的:-)