设置间隔后变量未定义

时间:2015-01-06 14:01:48

标签: javascript jquery undefined setinterval

我想知道为什么我的变量(最初设置为某个值)在从undefined访问时变为interval

考虑以下 JQuery

var TEST = {
    DIR: null,
    ITV: null,

    Init: function () {
        this.DIR = 1;
        this.Action();
    },

    Action: function () {
        console.log(this.DIR);
        if (this.ITV == null)
            this.ITV = setInterval(this.Action, 1000);
    }
}

$(document).ready(function () {
    TEST.Init();
});

此代码的输出如下:

1
undefined

我理解1,因为TEST.DIR的值在1函数中设置为Init,当Action函数时它仍然是interval TEST.ITV是第一次被召唤。

但是,当从TEST.DIR调用第二个和所有其他时间来调用此函数时,undefined为{{1}},我不明白为什么。

另请参阅此 FIDDLE

有人可以向我解释我做错了什么或者我在忽视什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

this.Action作为其上下文的函数传递给setInterval,因此this不再指向TEST的实例,但默认为window }。试试这样:

var TEST = {
    DIR: null,
    ITV: null,

    Init: function () {
        this.DIR = 1;
        this.Action();
    },

    Action: function () {
        console.log(this.DIR);
        if (this.ITV == null)
            this.ITV = setInterval(function() {TEST.Action() }, 1000);
    }
}

$(document).ready(function () {
    TEST.Init();
});

http://jsfiddle.net/h44y81Lu/4/

答案 1 :(得分:1)

多数民众赞成因为'this'指的是你设定间隔中的窗口,这就是为什么它的未定义(没有window.DIR)

很多人都对'this'关键字有疑问,请查看MDN docs out