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

Когда я код:

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

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

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

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

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

Интерпретатор сначала хочет иметь левый операнд …

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

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

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

благодаря

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

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

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

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

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

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

Давайте будем гением компьютера.