Самозапускаемые функции
когда я код:
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);} })()()