在对象命名空间环境中从嵌套的setInterval调用嵌套函数

时间:2012-07-26 13:44:46

标签: javascript

我有以下这段代码:

var stats = {
....,
checkExistance :
function(url){
    var newUrl = url.substring(0, url.lastIndexOf("/")) + "/asyncCheckChartExistance";
    var xhrObj = stats.getXhr();

    var poolInterval = setInterval("poll()", 100);

    function poll(){
        xhrObj.open("GET", newUrl, true);
        xhrObj.send(null);

        xhrObj.onreadystatechange = function(){
            if(xhrObj.readyState === 4 && xhrObj.status === 200){
                if (xhrObj.responseText.length === true){
                    console.log("Exists!");
                    clearInterval(poolInterval);
                } else {
                    console.log("Not Yet!");
                }
            }
        }
    }
},
}

我创建了stats命名空间。在这个命名空间中,我正在尝试创建一个每秒轮询服务器的函数。我应该这样访问这个函数:stats.checkExistance(myUrl)

然而,似乎setInterval函数无法看到poll()函数。我知道这是正常的行为,考虑到它们嵌套在另一个函数中。

如果我要在Global命名空间中编写它,那就没有问题,但是我有兴趣在这种命名空间中使用它。有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:2)

当您将字符串传递给setInterval时,该字符串将被解释为全局代码,并且由于poll不是全局函数,因此会引发参考错误。

但是,您可以传递函数引用而不是字符串,并且因为poll函数在进行setInterval调用的作用域中可用,所以您可以这样写:

var poolInterval = setInterval( poll, 100 );

答案 1 :(得分:2)

将字符串传递给setInterval时,默认情况下,它在全局范围内运行,其中poll不会被定义,因为它只存在于checkExistance函数的范围内

要解决此问题,请将匿名函数传递给setInterval

var poolInterval = setInterval(function () {
    poll();
}, 100);

传递匿名函数通常是最好的主意,因为它允许您为间隔编写任何javascript表达式/语句,而不是仅调用一个函数。

答案 2 :(得分:1)

var stat = {
    say: function(name){
        function doit(){
            console.log(name);
        }
        setInterval(doit, 1000);
    }
};
stat.say("hi");​​​​​​​​​​​

一个简单的演示来展示如何。你会每秒看到“嗨”。