为什么Javascript中的'this'的上下文在这个例子中不会改变?

时间:2013-01-14 15:36:00

标签: javascript this

我在Javascript中尝试'this'的上下文,我有一种我不理解的情况。

基于从here找到的javascript工作方式,我理解当在对象上调用函数时,该对象将作为firest参数隐式传入(或者在使用call时显式传入方法

但是有两个案例我试图测试不符合我的预期。请看之后的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的答案,我updated the jsFiddle显示上下文恢复到窗口对象时产生的值

以下code with the call to callback.call(this)解决了我遇到的问题

3 个答案:

答案 0 :(得分:2)

  

这不应该显示b?

中的值

您正在调用(在b的上下文中)与this无关的函数。该函数在callback(默认对象)的上下文中调用a.showValwindow的副本)。

答案 1 :(得分:1)

您忘记了RunCallback的定义中的一步:

替换

callback();

callback.call(this);

答案 2 :(得分:1)

我认为您的问题是,当您调用callback时,您没有传递上下文,因此您正在失去this。尝试更新RunCallback,如下所示:

  this.RunCallback = function () {
   callback.call(this);
  }