在javascript中的父闭包中引用"this"

Jon*_*ney 9 javascript closures this

我想在Javascript中这样做:

function Z( f )
{
  f();
}

function A()
{
  this.b = function()
  {
    Z( function () { this.c() } );
  }

  this.c = function()
  {
    alert('hello world!');
  }
}

var foo = new A();
foo.b();
Run Code Online (Sandbox Code Playgroud)

它可以这样完成:

function Z( f )
{
  f();
}

function A()
{
  var self = this;
  this.b = function()
  {
    Z( function () { self.c() } );
  }

  this.c = function()
  {
    alert('hello world!');
  }
}

var foo = new A();
foo.b();
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Nic*_*ver 6

保持对父级的引用(就像你一样)是一种很好的方法,但是对于你的特定示例,不需要匿名包装器,你可以直接传递函数,如下所示:

var self = this;
this.b = function()
{
  Z(self.c);
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里测试它,没有这个包装器,实际上不需要self变量,你可以直接使用this,如下所示:

this.b = function()
{
  Z(this.c);
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里测试那个版本.


由于下面的注释中似乎存在一些混淆,上面的代码维护this 了这个问题,如果你想this在回调中维护/ context,请使用如下:.call()

this.b = function()
{
  Z.call(this, this.c);
}
Run Code Online (Sandbox Code Playgroud)

并为Z:

function Z( f )
{
  f.call(this);
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里测试一下.

  • 没有匿名包装器,`c`被错误的`this`引用调用. (2认同)