为什么在javascript匿名函数的末尾写“.call(this)”?

时间:2011-11-07 11:26:00

标签: javascript

我看过这样写的JavaScript(它是在演示中,我手边没有实际代码,但暗示这是正常的):

(function() {    

    var a = 1;

    this.sayA = function() {
        alert(a);
    }

}).call(this);

sayA();

我认为它是一个匿名函数,因此变量a不是全局可用的。

.call(this)有什么意义?由于此函数未嵌套,this只是窗口。它与仅在最后写()有什么不同?

4 个答案:

答案 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

  
      
  1. 如果功能代码是严格代码,请将ThisBinding设置为thisArg
  2.   
  3. 其他如果thisArgnullundefined,请将ThisBinding设置为全局对象。
  4.   
  5. ...
  6.   

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

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

它可能对草率代码没有影响,但它是一个很好的做法和未来兼容: - )