2013-09-05 2 views
1

В последнее время я заметил разницу в поведении между 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 запутаться.

+2

Размещение объявления функции в блоке (т. Е. Не в коде верхнего уровня в функции или глобальном коде) [не является законным ECMAScript] (http://kangax.github.io/nfe/#function-declarations- встроенные блоки) и браузеры, которые позволяют ему (т. е. все), предоставлять пользовательское расширение спецификации языка. Вы наблюдаете два разных пользовательских расширения языка. Утверждение «* Firefox не делает подъема, когда внутри блока' if' * немного вводит в заблуждение: Firefox не делает подъем в * любом * блоке, в том числе 'for'. – apsillers

+0

@apsillers - так безопасно предположить, что эта проблема является ** исключительно **, потому что Firefox не делает подъем в любом блоке? – Razor

+0

Из кода, который вы разместили здесь, да, отсутствие подъема для деклараций функций в блоках прекрасно учитывало бы наблюдаемое поведение. – apsillers

ответ

3

В Firefox не отображаются объявления функций за пределами for. Стандарт ECMA говорит, что все в порядке. Документация, к которой вы привязаны, не применима только к if блокам, кроме for.

+1

У вас есть несколько утверждений в обратном порядке: вы имеете в виду * в * -side, а спецификация ECMAScript делает * не * разрешать объявления функций внутри блоков. – bfavaretto

+0

«Firefox не выводит объявления функций [в] за пределами блоков' for' [изнутри блока]. Стандарт ECMA говорит, что все в порядке [что это происходит] ». Я не думаю, что ошибался. Я просто не понял. –

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