2010-09-28 75 views
3

如何從閉包返回而不從包含函數返回?從關閉返回?

在以下函數中,return語句實際上從GM_xmlhttpRequest返回:不是閉包。當然,我可以看到,我可以安排我的代碼,以便執行在閉包結束時結束,但我很好奇如何在示例中提前返回。

function GM_xmlhttpRequest(details, callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() { 
    if (xhr.readyState != 4) 
     return; // <-- zomg returns from parent function wtf 
    if (xhr.status != 200) 
     callback(null); 
    callback(xhr); 
    } 
    xhr.open('GET', details.url, true); 
    xhr.send(); 
}; 
+2

沒有辦法解決這個問題,除非解析器由於跳過字符而產生問題('{',';'等)。你知道'GM_xmlhttpRequest'會在調用完成後立即運行並完成,對嗎? – lincolnk 2010-09-28 16:01:23

回答

2

回報將只退出被叫(當前功能)和控制權返回給調用者(叫「父」功能),它永遠不會從呼叫者回報。在你描述的情況下,被呼叫者是設置爲onreadystatechange的匿名函數,並且沒有調用者(本身)。

GM_xmlhttpRequest返回不確定的onreadystatechange函數之前xhr.send()線運行後,因爲沒有回報語句和XHR是異步的。由於沒有調用者將控制權交還給「zomg wtf」行,因此會退出該匿名功能。

從ECMA-262,第三和第5版(部分12.9 返回語句):

return語句導致功能停止執行和一個值返回給調用者 。如果表達式被省略,則返回值是未定義的。否則,返回值是表達式的值。

+0

調整閉包使其不使用return,導致閉包使用不同的'readyState'值多次調用。顯式返回提前終止函數,並且不再進行調用。 – 2010-09-29 03:23:17