我在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)
解决了我遇到的问题
答案 0 :(得分:2)
这不应该显示b?
中的值
您正在调用(在b
的上下文中)与this
无关的函数。该函数在callback
(默认对象)的上下文中调用a.showVal
(window
的副本)。
答案 1 :(得分:1)
您忘记了RunCallback
的定义中的一步:
替换
callback();
与
callback.call(this);
答案 2 :(得分:1)
我认为您的问题是,当您调用callback
时,您没有传递上下文,因此您正在失去this
。尝试更新RunCallback,如下所示:
this.RunCallback = function () {
callback.call(this);
}