2010-09-28 95 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