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