Самозапускаемые функции

когда я код:

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

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

  • определить функцию;
  • передать указатель ссылки на Вызывается
  • a()
  • return в указателе новой функции
  • a() снова вызывается

и если да, то почему у меня есть синтаксическая ошибка:

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

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

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

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

)()

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

Спасибо

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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