1

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

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

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

EDIT: Ресурсы я ссылка

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

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

+0

Функция x() {} - это то же самое, что и var x = function() {}, а явный var "возвращает" void вместо назначения. Вот почему вы не можете сказать предупреждение (var x = 1), но вы можете сказать alert (x = 1), то же самое для функций. – dandavis

ответ

1

Не уверен, что вы имеете в виду именно - если вы запускаете объявление функции в том, как вы показали, он все равно будет выполнять сразу

(function declaredFn(){ 
 
    document.getElementById('result').innerHTML='executed'; 
 
}());
<div id="result"></div>

+0

Это не функция объявление, если вы [вызываете 'объявленныйFn' позже] (http://jsfiddle.net/faxbLfot/), это приведет к ошибке ссылки. – Teemu

+0

@Teemu - интересно, вы правы – codebox

+0

Извините, просто для уточнения, я узнал, что сразу можно вызвать только выражения функций, но вы не можете сразу вызвать объявления функций. Мне было интересно, почему это так. – amoeboar

2

Чтобы очистить путаницы

Что такое объявление функции

// 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 
}; 

во втором случае вы создали анонимный function.you еще есть ссылка на функцию через переменную a .so вы могли бы сделать a().

вызова функции выражение

var a = (function(){ 
    // code here 
}()); 

переменная а хранится с результатом функции (если вы вернетесь из функции) и теряет ссылку на эту функцию.

В обоих случаях вы можете сразу вызвать функцию, но результат отличается указанным выше.

2

Source:.

»... Интересно, если бы вы указать имя для этой функции и поставить скобки сразу после нее, анализатор может также бросить 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() {})(); 

, как это говорит анализатору, чтобы оценить его как выражение функции, в отличие от функции декларации. И все, что вы делаете, то немедленно вызывает выражение.

+0

Можно ли снова вызвать этот IIF позже, например, в Слушателе событий? –