JS: Почему важен порядок объявления функций внутри условного блока?

a();
function a() {
    $('.doit').text('Text was replaced (a)');   
}

if ($('.doit2').length) {
    b();
    function b() {
         $('.doit2').text('Text was replaced (b)');   
    }
}

a() вызывается правильно, а b выдает ошибку "b is not defined". Почему?

(Я читал о подъеме, но объявлено function b, а не переменная. Или я ошибаюсь?)

См. fiddle — Firefox выдает ошибку, а Chrome работает.


person giraff    schedule 16.07.2015    source источник
comment
Какой браузер вы используете. Вроде нормально работает в хроме. Скрипка   -  person Abhishek Prakash    schedule 16.07.2015
comment
у меня не выдает никакой ошибки и не должно   -  person smnbbrv    schedule 16.07.2015
comment
Не могли бы вы создать скрипку для создания этой проблемы? Я не вижу в этом проблемы, возможно, проблема где-то еще в вашем коде? Также не могли бы вы указать, какой браузер вы используете?   -  person Spencer Wieczorek    schedule 16.07.2015
comment
Возможный дубликат stackoverflow.com/ вопросы/23125529/   -  person Cerbrus    schedule 16.07.2015
comment
Вышеприведенный код отлично работает в хроме и для меня.   -  person Simpal Kumar    schedule 16.07.2015
comment
Ребята, вы круты. В моей скрипке была опечатка, поэтому я подумал, что Chrome тоже дает такое поведение...   -  person giraff    schedule 16.07.2015


Ответы (1)


Согласно спецификациям Javascript объявления функций не допускаются в условных выражениях (или любых других блоках). Следовательно, это технически неопределенное поведение. Некоторые браузеры пытаются создать разумное поведение. Однако вы не должны полагаться на то, что браузеры смогут правильно это интерпретировать.

Объявления функций могут появляться только в Program или FunctionBody. Синтаксически они не могут появляться в блоке ({...}) — например, в операторах if, while или for.

http://kangax.github.io/nfe/#function-declarations-in-blocks

person Leo Jiang    schedule 16.07.2015