关于poll
的范围,hegemon的回答大多是正确的–该函数不是全局的。但是,还有更多。
你写的方式poll
使它成为所谓的命名函数表达式。
请记住,在JavaScript中编写函数有两种方法。传统函数声明:
function foo() {
...
}
声明必须被命名,并hoisted顶端(基本上,分析执行任何指令之前)。可替代地,函数表达式:
var foo = function() {
...
}
或者
$.ajax('/', function() {
// this is what's known as an anonymous callback
});
或者
(function() {
// this is called a self-executing function...
})(); // <-- because we call it immediately
表达式像任何其他代码执行;他们没有被吊起来。
现在有趣的部分:函数表达式可能会被赋予一个可选的名称,但该名称不能在函数本身的范围之外访问。换句话说,
(function foo() {
// `foo` is this function
});
// `foo` will be undefined here
会非常喜欢写这样的:
(function() {
var foo = arguments.callee; // never do this
// `foo` is this function
});
// `foo` will be undefined here
因为一个事实,即一个命名函数表达式只能调用自身的(或在其范围内声明的函数调用) ,加上a whole host of browser bugs,命名函数表达式在调试器或分析器中添加一些上下文之外实际上是无用的。
所以现在我们来看看你的代码。
首先,您将浏览每个具有post
类的元素。 jQuery立即为每个匹配元素调用您的匿名回调函数。您尝试拨打电话号码poll
,但它:
- 由于函数表达式不会被悬挂;代码尚未运行,
poll
。
- 即使它已经运行(例如,如果您将
$.each
调用移动到底部),post
仍然未定义,因为poll
是一个命名的函数表达式,我们刚刚了解到这些标识符仅在函数内部可用本身。
接下来,你有一个自我执行的功能。 (最后一行为()
)。换句话说,poll
立即被调用,没有参数。您可能会看到一个长期调查发送pid=undefined
。
奖励:的complete
回调(后一个超时开始一个新的长查询或获取数据)确实按预期方式工作,因为poll
是正常范围在这一点上。
解决所有这些无稽之谈就像删除三个字符一样简单。希望通过这一点你可以找出那三个字符。 (提示:使你的表达的声明)
我不知道我是否真的知道我应该做什么。我删除了4个字符,最后是(最后)(),但是这个工作只有一次。它立即执行,但似乎在此之后再次执行。所以连接不会保持打开状态,然后一次失败...... – Ian 2012-04-18 04:49:22