1

我遇到了一个 - 看起来 - 有点奇怪的问题。假设我有一个这样的 JavaScript 对象:

var Object = {
    Property1: 0,
    Property2: 1,
    TxtProperty: "Sample text",

    Update: function () {
        this.Property1++;                      // Doesn't work
        Object.Property2++;                    // Does work
        this.TxtProperty = "Hello world";      // Does work

        $('#prop-1').text(this.Property1);     // Prints NaN
        $('#prop-2').text(Object.Property2);   // Prints correct value
        $('#txt-prop').text(this.TxtProperty); // Prints correct value
    }
};

请参阅this fiddle进行演示。单击“开始”以启动计时器并更新值。如您所见,使用parseInt也无济于事。

我已经在 Firefox、Chrome 和 IE10 中对此进行了测试。他们都表现出相同的行为。

为什么不能this从另一个具有函数值的属性中引用具有数值的属性?为什么它适用于非数字值?这是一个错误还是这是故意的?

这不是一个真正的问题,因为我们可以简单地使用父对象的名称来更新数值,但我只是好奇为什么会这样。

4

1 回答 1

2

setTimeoutwindow在上下文中运行该函数,因此this它的内部引用window. 如果你bind有适当的this上下文,那么它会正常工作:

interval = setInterval(Object.Update.bind(Object), 1000);
                                     -----^------

演示:http: //jsfiddle.net/wC2uM/2/

bind仅适用于现代浏览器,因此如果您需要对旧 IE 的支持,请使用匿名函数:

interval = setInterval(function(){ Object.Update(); }, 1000);

请记住,在 JavaScript 中this取决于您如何调用函数;它是可变的。

于 2013-05-16T07:54:51.673 回答