闭包返回值是什么?

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
1个回答

2
return语句只会退出当前函数(被称为“被调用函数”),并将控制权返回给调用它的函数(称为“父函数”),它永远不会从调用它的函数中返回。在您描述的情况下,callee是设置为onreadystatechange的匿名函数,并且没有明确的caller

GM_xmlhttpRequestxhr.send()行之后返回undefined,因为没有return语句,并且XHR是异步的。 "zomg wtf"行仅会退出该匿名函数,因为没有caller来传递控制权。
根据ECMA-262第3版和第5版(第12.9节return语句):

return语句会导致函数停止执行并将一个值返回给调用者。如果省略了Expression,则返回值为undefined。否则,返回值为Expression的值。


调整闭包,使其不使用return语句,会导致闭包被多次调用,并且每次调用时readyState的值都不同。显式的return语句会过早终止函数执行,之后不再进行任何调用。 - Matt Joiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接