Самозапускаемые функции
Когда я код:
var a = function() { alert("44") return function(){alert(33)} }()();
Это выражение оценивается в следующем порядке?
- Определить функцию;
- Передать свой ссылочный указатель на
- Вызывается a ()
- Return в aa новый указатель функции
- A () вызывается снова
И если да, то почему у меня есть синтаксическая ошибка, если я это делаю:
function() { alert("44") return function(){alert(33)} }();
Интерпретатор сначала хочет иметь левый операнд …
Но этот синтаксис работает:
( function() { alert("44") return function(){alert(33)} }; )()
Внешняя скобка, что означает значение ???
благодаря
Это синтаксис языка. Если вы хотите выполнить на месте анонимную функцию, вы должны заключить ее в parens.
JS имеет эти крайние случаи, когда синтаксис более странный, чем вы ожидаете. Возьмем, например, удаление строки, в которой JSON не работает, если она не обернута парами.
// Wrong eval("{ ... }"); // Right eval("({ ... })");
Это синтаксис языка.
Тем не менее, я думаю (и это строго ИМХО), шаги, которые вы наметили, не точны.
- Функция определена и вызывается. предупреждение ( "44"); В результате.
- Функция возвращает другую функцию, которая также вызывается. оповещение ( "33"); случается.
- Самая внутренняя функция ничего не возвращает, поэтому a фактически не определена. Typeof возвращает «undefined».
-
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. (function() { alert("44"); return function(){alert(33);} })()()