В JavaScript почему я не могу сразу вызывать объявления функций?

Только выражения функций могут быть немедленно вызваны:

(function () {
    var x = "Hello!!";      // I will invoke myself
})();

Но не объявления функций? Это потому, что объявления функций поднимаются и уже выполняются немедленно?

РЕДАКТИРОВАТЬ: ресурсы, на которые я ссылаюсь

http://benalman.com/news/2010/11/immediately-invoked-function-expression/

http://markdalgleish.com/presentations/gettingclosure/

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>

Другие вопросы по тегам