关于范围poll
,霸主的回答大多是正确的——函数不是全局的。然而,还有更多。
您编写的方式poll
使其成为所谓的命名函数表达式。
请记住,在 JavaScript 中有两种编写函数的方法。传统的函数声明:
function foo() {
...
}
声明必须被命名,并被提升到顶部(基本上,在执行任何指令之前解析)。或者,函数表达式:
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
由于命名函数表达式只能调用自身(或由在其范围内声明的函数调用),加上一大堆浏览器错误,命名函数表达式除了在调试器或分析器中添加一些上下文之外几乎没有用处.
所以现在让我们来看看你的代码。
首先,您遍历每个具有post
类的元素。jQuery 立即为每个匹配的元素调用您的匿名回调。您尝试调用poll
,但它:
- 还不存在,因为函数表达式没有被提升;
poll
代码还没有运行。
- 即使它已经运行(例如,如果您将
$.each
调用移到底部),post
仍然是未定义的,因为poll
它是一个命名函数表达式,我们刚刚了解到这些标识符仅在函数本身内部可用。
接下来,您有一个自执行功能。(()
在最后一行。)换句话说,poll
立即调用,不带参数。您可能会看到一个长轮询发送pid=undefined
。
奖励:回调complete
(在一次超时或获取数据后开始新的长轮询)确实按预期工作,因为poll
此时在范围内正确。
修复所有这些废话就像删除三个字符一样简单。希望到此为止,您能够弄清楚它们是哪三个字符。(提示:让你的表达成为一个声明。)