为什么在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只是窗口。 它与最后只写()什么不同?

否 – 不是严格模式 :

  1. 如果函数代码是严格代码,则将ThisBinding设置为thisArg
  2. 否则,如果thisArgnullundefined ,请将ThisBinding设置为全局对象。

在严格模式下, this只是直接设置为给定的值,对于正常的调用是undefined的。 因此, .call(this)用于显式地传递全局对象。您可以在控制台中尝试以下操作:

 > (function() { "use strict"; console.log(this); })() undefined > (function() { "use strict"; console.log(this); }).call(this) Window 

它可能没有区别,但这是一个很好的做法和未来兼容的:-)