Вернуться из закрытия? - PullRequest
       4

Вернуться из закрытия?

3 голосов
/ 28 сентября 2010

Как можно вернуться из замыкания, не возвращаясь из содержащей функции?

В следующей функции оператор 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 Ответ

2 голосов
/ 28 сентября 2010

return будет только когда-либо выходить из вызываемой (текущей функции) и возвращать управление вызывающей (вызывая «родительскую» функцию), она никогда не будетвозврат от звонящего по телефону .В описываемой вами ситуации вызываемый является анонимной функцией, установленной на onreadystatechange , и вызывающего абонента нет (как такового).

GM_xmlhttpRequest возвращает undefined после строки xhr.send() перед выполнением функции onreadystatechange , поскольку отсутствует оператор return и XHR является асинхронным.Строка "zomg wtf" просто выйдет из этой анонимной функции, поскольку нет вызывающей стороны для передачи управления обратно.

Из ECMA-262, 3-го и 5-го изданий (раздел 12.9 * 1028)* return оператор):

Оператор return приводит к тому, что функция прекращает выполнение и возвращает значение вызывающей стороне.Если Expression опущено, возвращаемое значение не определено.В противном случае возвращаемым значением является значение Выражение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...