首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么要在javascript匿名函数的末尾写上".call(this)“?

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

Stack Overflow用户
提问于 2011-11-07 19:26:00
回答 3查看 30.1K关注 0票数 60

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

代码语言:javascript
复制
(function() {    

    var a = 1;

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

}).call(this);

sayA();

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

.call(this)的意义何在?因为这个函数不是嵌套的,所以this只是一个窗口。这和只在最后写()有什么不同?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-07 19:45:43

试试这个:

代码语言:javascript
复制
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的成员函数一样的方法,特别是在创建用户定义的对象类型的实例时。

票数 33
EN

Stack Overflow用户

发布于 2012-08-20 11:11:28

我对此很好奇,因为我刚刚看过John Resig关于this video的演讲。Yoshi有一个很好的答案,但我必须在控制台日志中测试一下才能理解,我认为对他的答案的修改可能会帮助一些像我这样一开始遇到麻烦的人:

代码语言:javascript
复制
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(这)本质上提供了将当前上下文传递给匿名函数的能力。

谢谢你的问题,也感谢Yoshi清晰的回答!

票数 33
EN

Stack Overflow用户

发布于 2011-11-07 19:36:17

传递给函数的this设置执行的上下文,因此在匿名函数中,this引用window

然后就可以编写this.alert('');了。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8035822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档