我有以下这段代码:
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命名空间中编写它,那就没有问题,但是我有兴趣在这种命名空间中使用它。有任何想法吗?谢谢!
答案 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");
一个简单的演示来展示如何。你会每秒看到“嗨”。