2014-01-28 4 views
2

Я бы ожидать, что это (уменьшенная ради примера) функции для запуска без сучка, но он не в счет fn2 is not defined:Функция подъема и оператор возврата

void function(){ 
    var var1 = fn1(); 
    var var2 = fn2(); 

    function fn1(){}; 

    return function fn2(){}; 
}(); 

Как оператор возврата исключает функциональное выражение для fn2 от подъема?

ответ

3

Поднята только функция, созданная с помощью функции Объявление. Функция в return function fn2(){}; создана с (названной) функцией выражение так не поднимается.

Как оценивается функция, зависит от контекста. Любая функция внутри оператора (например, оператор return) анализируется как выражение функции. Другим примером является использование круглых скобок в IIFEs: скобки действуют как оператор группировки, гарантируя, что содержимое круглых скобок оценивается как выражение.

Много информации об этом можно найти в превосходной статье Kangax в:

http://kangax.github.io/nfe/

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