Самопризывающие функции

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

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)}
  };

)()

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

Спасибо

3 ответа

Решение

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

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

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

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

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

  1. Функция определена и вызвана. предупреждение ("44"); происходит в результате.
  2. Функция возвращает другую функцию, которая также вызывается. оповещение ("33"); случается.
  3. Самая внутренняя функция ничего не возвращает, поэтому она фактически не определена. typeof возвращает "undefined".
  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);} })()()

Другие вопросы по тегам