从关闭回来?

时间:2010-09-28 15:49:56

标签: javascript closures

如何在不从包含函数返回的情况下从闭包返回?

在以下函数中,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();
};

1 个答案:

答案 0 :(得分:2)

return 只会退出被调用者(当前函数)并将控件返回给调用者(调用“父”函数),它将永远不会从来电者返回。在您描述的情况下,被调用者是设置为 onreadystatechange 的匿名函数,并且没有调用者(本身)。

onreadystatechange 函数运行之前,

GM_xmlhttpRequest xhr.send()行之后返回 undefined ,因为没有 return 语句和XHR是异步的。 “zomg wtf”行将退出该匿名函数,因为没有调用者将控制权传回。

来自ECMA-262,第3版和第5版(第12.9节返回声明):

  

return语句会导致函数停止执行并将值返回给   呼叫者。如果省略 Expression ,则返回值未定义。否则,返回值是 Expression 的值。