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