2012-06-21 3 views
28

У меня есть несколько разных проектов, и я видел два разных способа создания jquery/javascript-функций.Разница между назначением функции переменной или нет

Первое:

function testFunction(){ 

}; 

Второе:

var testFunction = function(){ 

}; 

Есть ли разница между ними?

+3

HTTP: // kangax. github.com/nfe/ читать это –

+0

Прикомандировано ....... –

ответ

43

Главным отличием является первое (объявление функции): Поднял в верхнюю часть области, в которой он объявлен, тогда как второй (выражение функции) не является.

Это причина, вы можете вызвать функцию, которая была объявлена ​​после того, как вы это называете:

testFunction(); 
function testFunction() {} 

Вы не можете сделать это с выражением функции, так как назначение происходит на месте:

testFunction(); 
var testFunction = function() {}; //TypeError 

Существует также третья форма (имени функции выражение):

var testFunction = function myFunc() {}; 

В этом случае идентификатор myFunc находится только в области видимости внутри функции, тогда как testFunction доступен в том объеме, который был объявлен. BUT (и всегда есть, но когда дело доходит до Internet Explorer) в IE ниже версии 9 идентификатор myFunc ошибочно просачивается в область содержимого. Именованные функциональные выражения полезны, когда вам нужно обратиться к вызывающей функции (поскольку arguments.callee устарел).


Также обратите внимание, что то же самое верно и для объявления переменных:

console.log(x); //undefined (not TypeError) 
var x = 10; 

Вы можете себе представить, что двигатель JavaScript интерпретирует код как это:

var x; //Declaration is hoisted to top of scope, value is `undefined` 
console.log(x); 
x = 10; //Assignment happens where you expect it to 
+8

+1 *** Знание *** Я не знал, как это сработало. Я столкнулся с проблемами с 'var testFunction = function() {}' и не знал почему. Это имеет смысл. – iambriansreed

+0

IE9 исправил эту ошибку, правда, правильно? –

+0

@ ŠimeVidas - Верно. Я добавлю это. –

Смежные вопросы