使用setInterval时为什么对象属性未定义

时间:2016-04-11 19:07:19

标签: javascript object methods this setinterval

如下面的代码,我创建一个名为" test"的对象,并为其提供属性和方法。

该财产来自其论点。

我尝试在onload后每2秒调用一次该方法,结果显示未定义。

但是如果我只调用不使用setInterval()的方法,就像这样

window.onload = function() {
   giveword.showWord();
}

我能够显示文字"嗨" ..为什么会这样?

var giveword = new test("Hi");

function test(word) {
    this.word = word;
}

test.prototype.showWord = function() {
    document.getElementById("msg_box").innerHTML = this.word;
}

window.onload = function() {
    setInterval(giveword.showWord, 2000);
}

感谢您的帮助...

1 个答案:

答案 0 :(得分:2)

原因是因为在你的test.prototype.showWord函数中,你的this对象指的是调用函数的上下文,它是从setInterval调用时的窗口对象。

我认为你想要做的是使用一个闭包来使showWord()的上下文成为这样的giveword实例:

        var giveword = new test("Hi");

        function test(word) {
            this.word = word;
        }

        test.prototype.showWord = function() {
            document.getElementById("msg_box").innerHTML = this.word;
        }


        window.onload = function(){
            setInterval(function(){giveword.showWord();}, 2000); // <<-- here's the closure
        }

不同之处在于,对于闭包,您告诉setInterval函数在上下文中调用函数,就像声明setInterval时一样。当声明setInterval时,在范围内有一个名为giveword的变量,它有一个方法showWord(),它返回初始输入的值。 (关闭很难解释,如果你需要更多信息,我担心你会得到最好的服务解释他们。)