В JavaScript почему я не могу сразу вызывать объявления функций?
Только выражения функций могут быть немедленно вызваны:
(function () {
var x = "Hello!!"; // I will invoke myself
})();
Но не объявления функций? Это потому, что объявления функций поднимаются и уже выполняются немедленно?
РЕДАКТИРОВАТЬ: ресурсы, на которые я ссылаюсь
http://benalman.com/news/2010/11/immediately-invoked-function-expression/
3 ответа
"... Интересно, что если бы вы указали имя для этой функции и поставили сразу после нее символы parens, синтаксический анализатор также сгенерировал бы ошибку SyntaxError, но по другой причине. В то время как символы Парены после выражения указывают, что выражение является Функция, которая должна быть вызвана, паренсы, помещенные после оператора, полностью отделены от предыдущего положения и являются просто оператором группировки (используется как средство контроля приоритета оценки). "
// While this function declaration is now syntactically valid, it's still
// a statement, and the following set of parens is invalid because the
// grouping operator needs to contain an expression.
function foo(){ /* code */ }(); // SyntaxError: Unexpected token )
// Now, if you put an expression in the parens, no exception is thrown...
// but the function isn't executed either, because this:
function foo(){ /* code */ }( 1 );
// Is really just equivalent to this, a function declaration followed by a
// completely unrelated expression:
function foo(){ /* code */ }
( 1 );
Поэтому вам нужно написать функцию как
(function doSomething() {})();
поскольку это говорит синтаксическому анализатору оценивать его как выражение функции, а не как объявление функции. И тогда все, что вы делаете, это сразу вызываете выражение.
Чтобы убрать путаницу
Что такое объявление функции
// this is function declaration
function foo(){
// code here
}
ИЛИ ЖЕ
//this is ok, but without name, how would you refer and use it
function (){
// code here
}
чтобы позвонить немедленно, вы делаете это
function foo(){
// code here
}()
Что такое выражение функции
// this is a function expression
var a = function foo(){
// code here
};
или же
var a = function (){
// code here
};
во втором случае вы создали анонимную функцию. У вас все еще есть ссылка на функцию через переменную a
так что вы могли бы сделать a()
,
вызывая выражение функции
var a = (function (){
// code here
}());
переменная a сохраняется с результатом функции (если вы вернетесь из функции) и теряет ссылку на функцию.
В обоих случаях вы можете немедленно вызвать функцию, но результат отличается, как указано выше.
Не уверен, что именно вы имеете в виду - если вы запустите объявление функции так, как вы показали, оно все равно будет выполнено немедленно
(function declaredFn(){
document.getElementById('result').innerHTML='executed';
}());
<div id="result"></div>