關於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