公共变量在私有方法中返回undefined

时间:2014-07-23 18:56:41

标签: javascript oop

我有一段非常简单的代码,我的问题是:为什么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

欢迎任何其他建议,谢谢!

2 个答案:

答案 0 :(得分:3)

那是因为你没有在正确的背景下调用它。

如果你添加

console.log(this)

getWheel开始时,您会看到thiswindow,这是非严格模式下的全局默认上下文。

解决方案是改变

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);
    };

};