В последнее время я заметил разницу в поведении между Firefox и другими браузерами для следующего яваскрипта кода:Javascript определения функции между браузерами
var condition = true;
A();
function A() {
var x=0;
for(var i=0; i<10; i++) {
if(condition) {
++x;
B();
}
function B() {
console.log("B function. x = "+x);
}
}
}
Chrome, Opera, IE выход:
B function. x = 1
B function. x = 2
B function. x = 3
B function. x = 4
B function. x = 5
B function. x = 6
B function. x = 7
B function. x = 8
B function. x = 9
B function. x = 10
Firefox выход:
ReferenceError: B is not defined
Однако, есть нет жалоб от Firefox и выдает тот же результат как и другие браузеры, если я ставлю определение function B
перед вызовом, как это:
for(var i=0; i<10; i++) {
function B() {
console.log("B function. x = "+x);
}
if(condition) {
++x;
B();
}
}
На основании этой цитаты с сайта разработчиков Mozilla:
функции должны находиться в области видимости, когда они называются, но объявление функции может быть ниже вызова
Я понимаю, Зов, A()
работ. Но я не понимаю, почему существует разница в поведении между Firefox и другими при вызове B()
, когда вызов до определения.
При попытке выяснить причину, я читал о функции подъёмнойhere, который говорит, что Firefox не делает грузоподъемным когда внутри if
блока, но определение никогда не было внутри if
заявления в моем случае, так Im запутаться.
Размещение объявления функции в блоке (т. Е. Не в коде верхнего уровня в функции или глобальном коде) [не является законным ECMAScript] (http://kangax.github.io/nfe/#function-declarations- встроенные блоки) и браузеры, которые позволяют ему (т. е. все), предоставлять пользовательское расширение спецификации языка. Вы наблюдаете два разных пользовательских расширения языка. Утверждение «* Firefox не делает подъема, когда внутри блока' if' * немного вводит в заблуждение: Firefox не делает подъем в * любом * блоке, в том числе 'for'. – apsillers
@apsillers - так безопасно предположить, что эта проблема является ** исключительно **, потому что Firefox не делает подъем в любом блоке? – Razor
Из кода, который вы разместили здесь, да, отсутствие подъема для деклараций функций в блоках прекрасно учитывало бы наблюдаемое поведение. – apsillers