我有一段非常简单的代码,我的问题是:为什么this.wheels
私有方法中的变量getWheel()
未定义?我确实通过将上下文作为参数传递给公共this.spinWheel()
方法中的一个参数来解决它(写getWheel.call(this, wheelNumber)
),但这只是我读完一篇文章后拍的,我不太清楚是什么我这样做是因为文章不太好。
我知道这是函数获取错误上下文的东西,但我无法掌握它(如果私有函数在Car
内,为什么不能获得正确的上下文?) 。有人可以详细解释或提供一个好的阅读资源吗?
的JavaScript :
Car = function () {
this.wheels = [1, 2, 3, 4];
function getWheel (wheel) {
this.wheels.some(function (element, index, array) {
if (element == wheel) {
document.getElementById("text").innerHTML = "Wheel " + element + ": vruuum!";
}
});
};
this.spinWheel = function (wheelNumber) {
getWheel(wheelNumber);
};
};
var myCar = new Car();
myCar.spinWheel();
代码为in this JsFiddle。
欢迎任何其他建议,谢谢!
答案 0 :(得分:3)
那是因为你没有在正确的背景下调用它。
如果你添加
console.log(this)
在getWheel
开始时,您会看到this
是window
,这是非严格模式下的全局默认上下文。
解决方案是改变
this.spinWheel = function (wheelNumber) {
getWheel(wheelNumber);
};
到
this.spinWheel = function (wheelNumber) {
getWheel.call(this, wheelNumber);
};
您还可以在构造函数中声明一个包含this
的变量并直接使用它,或将this.wheels
存储在私有变量中。
答案 1 :(得分:0)
除了dystroy的解决方案,你可以将轮子声明为var
。请注意getWheel
的小变化。
Car = function () {
var wheels = [1, 2, 3, 4];
function getWheel (wheel) {
wheels.some(function (element, index, array) {
if (element == wheel) {
document.getElementById("text").innerHTML = "Wheel " + element + ": vruuum!";
}
});
};
this.spinWheel = function (wheelNumber) {
getWheel(wheelNumber);
};
};