如何在不从包含函数返回的情况下从闭包返回?
在以下函数中,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();
};
答案 0 :(得分:2)
return 只会退出被调用者(当前函数)并将控件返回给调用者(调用“父”函数),它将永远不会从来电者返回。在您描述的情况下,被调用者是设置为 onreadystatechange 的匿名函数,并且没有调用者(本身)。
在 onreadystatechange 函数运行之前, GM_xmlhttpRequest 在xhr.send()
行之后返回 undefined ,因为没有 return 语句和XHR是异步的。 “zomg wtf”行将退出该匿名函数,因为没有调用者将控制权传回。
来自ECMA-262,第3版和第5版(第12.9节返回声明):
return语句会导致函数停止执行并将值返回给 呼叫者。如果省略 Expression ,则返回值未定义。否则,返回值是 Expression 的值。