Firefox по-разному интерпретирует операторы функций и, по-видимому, они нарушили объявление для объявления функций. ( Хорошее чтение об именованных функциях / объявлении против выражения )
Почему Firefox по-разному интерпретирует операторы из-за следующего кода:
if ( true ) {
function test(){alert("YAY");}
} else {
function test(){alert("FAIL");}
}
test(); // should alert FAIL
Из-за объявления декларации, функция test
всегда должна предупреждать "сбой", но не в Firefox. Приведенный выше код на самом деле предупреждает «YAY» в Firefox, и я подозреваю, что код, который делает это, в конце концов полностью нарушил декларацию.
Я предполагаю, что Firefox превращает объявления функций в объявления var, когда они находятся в операторах if / else или try / catch. Вот так:
// firefox interpretted code
var test; // hoisted
if (true) {
test = function(){alert("yay")}
} else {
test = function(){alert("fail")}
}
После короткой дискуссии с Шиме Видасом я должен сказать, что работа Firefox с объявлениями функций нестандартна из-за:
SourceElement производства:
Заявление обрабатывается для функции
декларации , не предпринимая никаких действий .
Производство SourceElement: Заявление
оценивается следующим образом:
- Оценка заявления.
- Результат возврата (1).
И FunctionDeclaration, и Statement являются SourceElements, следовательно, внутри оператора не должно быть FunctionDeclarations (if / else, try / catch). Дайте Шиме Видасу пирожное!
Try / catch - это, по сути, еще одна форма if / else, и, вероятно, она использует тот же код исключения.