1

我有以下这段代码:

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 命名空间中编写它,那将没有问题,但我有兴趣在这种命名空间中进行这项工作。有任何想法吗?谢谢!

4

3 回答 3

2

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

但是,您可以传递函数引用而不是字符串,并且由于该poll函数在进行调用的范围内可用,因此setInterval您可以这样写:

var poolInterval = setInterval( poll, 100 );
于 2012-07-26T13:47:45.063 回答
2

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

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

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

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

于 2012-07-26T13:50:37.140 回答
1
var stat = {
    say: function(name){
        function doit(){
            console.log(name);
        }
        setInterval(doit, 1000);
    }
};
stat.say("hi");​​​​​​​​​​​

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

于 2012-07-26T13:57:12.710 回答