Вопрос

когда я кодирую:

var a =
function()
{
    alert("44")
    return function(){alert(33)}
}()();

это выражение оценивается в следующем порядке?

  1. определить функцию;
  2. передать его указатель ссылки на
  3. a() вызывается
  4. вернуться в новый указатель на функцию
  5. a() вызывается снова

и если да, то почему у меня возникает синтаксическая ошибка, если я это делаю:

function()
{
    alert("44")
    return function(){alert(33)}
}();

интерпретатору сначала нужен левый операнд...

но этот синтаксис работает:

(
  function()
  {
    alert("44")
    return function(){alert(33)}
  };

)()

внешняя скобка что означает???

Спасибо

Это было полезно?

Решение

Это синтаксис языка.Если вы хотите выполнить анонимную функцию на месте, вы должны заключить ее в круглые скобки.

В JS есть крайние случаи, когда синтаксис более странный, чем вы ожидаете.Возьмем, к примеру, определение строки, содержащей JSON, не работает, если она не заключена в круглые скобки.

// Wrong
eval("{ ... }");
// Right
eval("({ ... })");

Это синтаксис языка.

Тем не менее, я считаю (и это строго ИМХО), что изложенные вами шаги не точны.

  1. Функция определена и вызвана.предупреждение("44");происходит в результате.
  2. Функция возвращает другую функцию, которая также вызывается.оповещение("33");случается.
  3. Самая внутренняя функция ничего не возвращает, поэтому a фактически не определена.typeof a возвращает «неопределенное».

Другие советы

  1. function() { alert("44") return function(){alert(33)} } вы определяете функцию
  2. function() { alert("44") return function(){alert(33)} }() вы вызываете эту функцию, возвращая анонимную функцию function(){alert(33)}
  3. function() { alert("44") return function(){alert(33)} }()() вы вызываете возвращаемую функцию, поэтому на самом деле это эквивалентно function(){alert(33)}()

Таким образом, все выполнение эквивалентно:

alert("44"); alert(33);

Я тоже только изучаю функции самовызова.
И я думаю, что код должен быть 3. (function() { alert("44"); return function(){alert(33);} })()()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top