Я слышал, что он утверждал, что включение выражения функции в оператор if является плохой практикой в контексте JavaScript. Почему это так?Размещение оператора функции в операторе if
ответ
Это плохая практика, потому что объявления функций «взвалил» в верхней части лексической области НЕЗАВИСИМО из входит ли ваш код, что часть 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
.
Вы можете видеть, как вводить в заблуждение и запутывать это потому, что это противоречит вашим ожиданиям.
Красивое объяснение. Благодарю. У меня создалось впечатление, что единственное, что было поднято, это переменная с именем функции со значением «undefined» и что фактическое тело функции не было присвоено этому имени до более позднего времени. Но, если я правильно понимаю вас, это всего лишь одно из выражений функции. – George
Объявление функций полностью завершено (фактический объект функции, а также идентификатор). Объявления переменной выгружаются только с идентификатором вместе со значением 'undefined'. – wmock
- 1. Использование оператора CountIf в операторе If
- 2. Использование оператора == дважды в операторе if
- 3. Изменение оператора if в операторе while
- 4. Использование оператора if в операторе for
- 5. Выполнение функции в операторе if php
- 6. PHP - Размещение оператора IF в переменную
- 7. Использование overloader оператора в операторе перегрузки функции
- 8. Размещение iPhone5 с использованием оператора IF?
- 9. Использование оператора IF в функции
- 10. Использование функции Concatenate в операторе IF
- 11. Javascript ИЛИ в операторе IF
- 12. SQL-сервер: с помощью оператора if в операторе
- 13. Могу ли я использовать операторы оператора 2 в операторе If
- 14. Для оператора Loop и If. Как совместить в одном операторе
- 15. Ошибка в операторе if
- 16. Logic в операторе IF
- 17. PHP в операторе IF
- 18. Функция вызова шаблона SilverStripe в операторе if
- 19. Переменная недоступна в операторе if
- 20. Два оператора sql if
- 21. Вывод из оператора if
- 22. Java-использование переменной, созданной в операторе if
- 23. Сохранять значение в переменной из оператора if в операторе оператора switch
- 24. Java = произвольное размещение оператора if дает отличный результат?
- 25. Использование операторов «if» в операторе Linq
- 26. более 2 или операторов в операторе if
- 27. Создайте переменную в операторе IF
- 28. Использование IF в операторе обновления
- 29. Использование $ (this) в операторе if
- 30. Обратный цикл в операторе if
Обратите внимание, что размещение объявления функции формы 'someVariable = function() {}' (которое не является оператором функции) в блоке if в порядке. (В этом случае 'someVariable' должен быть объявлен где-то перед оператором if.) – nnnnnn
Приведите пример кода. – jfriend00
@nnnnnn Я согласен с вами, хотя обычно описанный вами сценарий не называется объявлением функции. Вместо этого его обычно называют созданием функциональных выражений. – wmock