@mobileDeveloper

Разное поведение интерпретатора javascript в Chrome и Firefox?

Коллега случайно наткнулся на следующее различие в работе браузеров. Используются последнии версии.

Код:
<html>
    <head>
        <script>
            function test() {
                functionExpressionOrFunctionDeclaration();
                
                if (true) {
                    function  functionExpressionOrFunctionDeclaration()  {
                        console.log('run');
                    }
                }
            }
            
            test();
        </script>
    </head>
</html>


Chrome выведет 'run'.
Firefox (IE11 тоже) выведет 'ReferenceError: functionExpressionOrFunctionDeclaration is not defined'.
В документации https://developer.mozilla.org/en-US/docs/Web/JavaS... написано почему так происходит.
"A function declaration is very easily (and often unintentionally) turned into a function expression."

Я всегда считал, что в данном случае поведение у Хрома верное, но теперь засомневался, а в спецификации ECMAScript не смог найти ответа.

Какой браузер себя ведёт правильно?
  • Вопрос задан
  • 2702 просмотра
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
Вот тут разобрано подробно.

dmitrysoshnikov.com/ecmascript/ru-chapter-5-functi...

Формально, оба правы, т.к. данная ситуация не определена стандартом
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Я на стороне FF в вопросе невозможности появления FD в блоке инструкций. Если это называется блок инструкций, то декларации там не место.
Ответ написан
Комментировать
@mobileDeveloper Автор вопроса
@Lynn дал правильную ссылку на Дмитрия Сошникова, только я не могу выбрать его комментарий как правильный ответ.
Ответ написан
Комментировать
Вот для подобных вещей и существует "use strict". С ним вы получите "SyntaxError", так как декларация функции не может находиться в statement блоках.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы