zlowar: функция создается в момент когда создается родительский скоуп, когда функция вызывается для неё создается свой скоуп, при этом биндятся переменные из родительских скоупов.
> funcTwo(); // a
Этот результат получается потому что к функции прибиндина переменная "а" из скоупа funcOne, т.к. там функция и создана.
Можно смотреть проще - идти вверх по иерархии, а там только "var a = 'a';"
Алексей Самсонов: спасибо нашел то что нужно.
Оба этих объявления говорят интерпретатору: "объяви переменную sum, создай функцию с указанными параметрами и кодом и сохрани её в sum".
zlowar: повнимательнее, ведь "Основное отличие между ними: функции, объявленные как Function Declaration, создаются интерпретатором до выполнения кода. Поэтому их можно вызвать до объявления. А если бы это было объявление Function Expression, то такой вызов бы не сработал:
sayHi("Вася"); // ошибка!
var sayHi = function(name) {
alert( "Привет, " + name );
}
Это из-за того, что JavaScript перед запуском кода ищет в нём Function Declaration (их легко найти: они не являются частью выражений и начинаются со слова function) и обрабатывает их.
А Function Expression создаются в процессе выполнении выражения, в котором созданы, в данном случае – функция будет создана при операции присваивания sayHi = function...
Как правило, возможность Function Declaration вызвать функцию до объявления – это удобно, так как даёт больше свободы в том, как организовать свой код.
Можно расположить функции внизу, а их вызов – сверху или наоборот."