1

我正在尝试使用 Javascript 中的“this”上下文,但遇到了一种我不明白的情况。

根据从此处找到的 javascript 工作方式,我了解当在对象上调用函数时,该对象会作为最触发参数隐式传入(或在使用call方法时显式传入。

但是有 2 个案例我尝试测试并没有达到我的预期。请查看//Why doesn't work?之后的 2 行 为什么以下 2 个值未定义?

这是jsFiddle中的代码(也粘贴在下面)

function Beta(c, myValParam) {
  var callback = c;
  this.myVal = myValParam;
  this.RunCallback = function () {
   callback();
  }

  this.ShowVal = function () {
    alert("FROM Beta: " + this.myVal);
  }
}

function Alpha() {
  this.myVal = "Alpha's Property";
  this.ShowVal = function () {
    alert("FROM Alpha: " + this.myVal);
  }
}
a = new Alpha();
a.ShowVal();

b = new Beta(a.ShowVal, "Beta's property passed in");
b.ShowVal();

//Why doesn't ths work? Why are the follwoing 2 values undefined?
b.RunCallback.call(b); //Shouldn't this display the value in b?
b.RunCallback();

b2 = new Beta(function() { return a.ShowVal.call(a); }, "Z");
b2.RunCallback();

编辑:感谢 Quentin、dystroy 和dough 的回答,我更新了 jsFiddle以显示上下文恢复到窗口对象时产生的值

这是解决我遇到的问题的调用代码 callback.call(this)

4

3 回答 3

2

Shouldn't this display the value in b?

You are calling (in the context of b) a function which does nothing with this. That function calls callback (which is a copy of a.showVal) in the context of window (the default object).

于 2013-01-14T15:39:46.487 回答
1

You forgot one step in the definition of RunCallback :

Replace

callback();

with

callback.call(this);
于 2013-01-14T15:39:57.407 回答
1

我认为您的问题是,当您调用时,callback您没有传递上下文,因此您输了this. 尝试像这样更新 RunCallback:

  this.RunCallback = function () {
   callback.call(this);
  }
于 2013-01-14T15:45:42.867 回答