2015-01-03 2 views
0

Я слышал, что он утверждал, что включение выражения функции в оператор if является плохой практикой в ​​контексте JavaScript. Почему это так?Размещение оператора функции в операторе if

+0

Обратите внимание, что размещение объявления функции формы 'someVariable = function() {}' (которое не является оператором функции) в блоке if в порядке. (В этом случае 'someVariable' должен быть объявлен где-то перед оператором if.) – nnnnnn

+0

Приведите пример кода. – jfriend00

+0

@nnnnnn Я согласен с вами, хотя обычно описанный вами сценарий не называется объявлением функции. Вместо этого его обычно называют созданием функциональных выражений. – wmock

ответ

4

Это плохая практика, потому что объявления функций «взвалил» в верхней части лексической области НЕЗАВИСИМО из входит ли ваш код, что часть if заявления.

Например:

var someFunction = function() { 
    var num = 5; 

    if (num !== 5) { 
    function anotherFunction() { 
     console.log('hello there'); 
    } 
    } 

    anotherFunction(); 
}; 

someFunction(); // logs out 'hello there' 

anotherFunction Несмотря на то, был , казалось бы, заявил в if заявления, это не имеет значения для двигателя JavaScript, потому что все объявления функций поднимаются к верхней части лексической области видимости (в этом случае, в верхней части лексической области для функции someFunction). Вот почему можно вызвать anotherFunction за пределами инструкции if.

Это становится еще более трудным по следующему сценарию:

var someFunction = function() { 
    var num = 5; 

    if (num === 5) { 
    function anotherFunction() { 
     console.log('hello there'); 
    } 
    } else { 
    function anotherFunction() { 
     console.log('bye bye'); 
    } 
    } 

    anotherFunction(); 
}; 

someFunction(); // logs out 'bye bye' 

Вы бы ожидать результат как «привет мир», но причина этот второй сценарий журналы «Bye Bye», потому что в JavaScript двигатель тащит ВСЕ объявления функций в верхней части лексической области. Когда он поднимает первое объявление функции, идентификатор «anotherFunction» ссылается на объект функции с «hello there». Однако, когда он поднимает второе объявление функции, он просто присваивает другому объекту функции (тот, который «bye bye») существующему идентификатору anotherFunction.

Вы можете видеть, как вводить в заблуждение и запутывать это потому, что это противоречит вашим ожиданиям.

+0

Красивое объяснение. Благодарю. У меня создалось впечатление, что единственное, что было поднято, это переменная с именем функции со значением «undefined» и что фактическое тело функции не было присвоено этому имени до более позднего времени. Но, если я правильно понимаю вас, это всего лишь одно из выражений функции. – George

+0

Объявление функций полностью завершено (фактический объект функции, а также идентификатор). Объявления переменной выгружаются только с идентификатором вместе со значением 'undefined'. – wmock

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