Почему объявления функций обрабатываются по-разному в разных браузерах? - PullRequest
4 голосов
/ 15 января 2012

Хотя я не мог легко найти ссылку на это в google, я знаком с тем фактом, что в javascript объявления глобальных функций интерпретируются перед выполнением любого кода.Другими словами, это прекрасно работает:

f();
function f() {}

Однако я заметил, что chrome и firefox по-разному интерпретируют глобальное объявление функции.В частности, chrome рад чтению объявления функции, которое находится внутри блока if на первом проходе, а firefox - нет.

try {document.write(f);}               // works in chrome
catch(e) {document.write(e.message);}  // throws an error in firefox

try {document.write(g);}               // works in chrome and firefox
catch(e) {document.write(e.message);}

if(true) function f() {}
function g() {}

Вы можете попробовать этот пример самостоятельно с этим fiddle ,Я использую Chrome 16.0.912.75 и Firefox 9.0.1.

Что такое стандарт ECMA для этого поведения?Есть ли термин для этого процесса «поднятия» объявлений функций над другим кодом?Какой код становится «поднятым» открытым для интерпретации (оба браузера правы)?Или это ошибка в одном из них?

Ответы [ 2 ]

11 голосов
/ 15 января 2012

Объявления функций не являются действительными в блоках.У вас есть неопределенное поведение , которое равно undefined.

Подняты объявления функций на верхнем уровне (глобальном или верхнем уровне внутри функции).

Объявления функций внутри блоковсинтаксическая ошибка в строгом режиме

(function () { 
  "use strict"; 
  if (true) { 
    function g() { } 
  } 
})();

SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function.

0 голосов
/ 16 января 2012

Стандарт ECMA для этого поведения - выдавать SyntaxError при синтаксическом анализе сценария. К сожалению, это не совместимо с сетью, как говорит Рейнос.

См. Какой синтаксис объявления функции JS является правильным в соответствии со стандартом? для более подробного обсуждения проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...