Главным отличием является первое (объявление функции): Поднял в верхнюю часть области, в которой он объявлен, тогда как второй (выражение функции) не является.
Это причина, вы можете вызвать функцию, которая была объявлена после того, как вы это называете:
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
HTTP: // kangax. github.com/nfe/ читать это –
Прикомандировано ....... –