Это считается «плохим», потому что его поведение непоследовательно и иногда не делает то, что ожидало бы большинство людей. Рассмотрим следующий фрагмент кода:
if (true) {
function f() { return "t"; }
} else {
function f() { return "f"; }
}
Что бы призывающую f()
возвращение? В IE и Firefox он вернет "t"
, но в Chrome и Safari он вернет "f"
. Зачем? Сочетание правил подъема и JavaScript. Информацию о том, как это работает, см. В разделе this question on JavaScript scoping and hoisting.
Фактически это означает, что в некоторых браузерах ветвь полностью игнорируется, когда дело доходит до определения функций с использованием формы function name() { ... }
. Если вам действительно нужно сделать что-то подобное (и вы, вероятно, этого не сделаете, так как это будет очень плохой стиль), используйте форму name = function() { ... }
, так как это не будет поднято, поэтому поведение будет четко определено и будет не должны быть непоследовательными на разных платформах.
Не все браузеры обрабатывают, что точно так же ... –
Не могли бы вы поделиться с нами * как * браузеры отличаются от этого, и, возможно, ссылку на любое конкретное утверждение из стандарта ECMAScript, которое препятствует этому? – Sampson
Я думаю, что его также в значительной степени бессмысленно из-за подъема, функция просто перемещается в начало своей родительской функции и существует независимо от оператора if. Вероятно, это то, что он имеет в виду, когда браузеры обрабатывают его по-разному. http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html –