Отсутствует точка с запятой в JavaScript, что приводит к ошибке "'foo' is undefined" в IE9 - PullRequest
2 голосов
/ 22 марта 2011

Я просто потратил около четырех часов на поиск этой проблемы. Я знаю, что вызывает это, но не знаю, почему и «почему» беспокоит меня.

У меня есть следующий файл .js:

function funcA() {
}
function funcB() {
    do {
    } while (1 == 1) return 0
}

У меня также есть следующая HTML-страница:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title></title>
    <script src="JScript1.js" type="text/javascript"></script>
</head>
<body>
    <script type="text/javascript">
        new funcA();
    </script>
</body>
</html>

Когда я загружаю страницу в IE9, я получаю сообщение об ошибке «funcA не определено». Я могу избавиться от ошибки во время выполнения, выполнив любой из следующих действий:

  • Включение представления совместимости в IE9
  • Удаление DOCTYPE со страницы
  • Добавление точки с запятой через некоторое время и перед возвратом в JavaScript (т. Е. While (1 = 1); return 0)

Может кто-нибудь помочь мне понять, что именно здесь происходит?

Ответы [ 2 ]

1 голос
/ 22 марта 2011

К сожалению, JavaScript не требует, чтобы вы явно указывали точки с запятой везде, где должна быть одна - но это внутренне вставит их для вас. Это может часто приводить к трудно отслеживаемым ошибкам и неожиданному поведению.

Среди других синтаксических ошибок в вашем коде (как указывали другие), ; после while в do-while требуется , и когда вы вставляете туда, все работает как Вы ожидаете их. Когда это не сделано, для обычного разработчика практически невозможно предсказать, как поведут себя различные среды, не углубляясь в спецификации языка и JS engine и , понимая все это - при условии, что нет ошибки в реализации самого движка JS. Маленькие вещи, такие как наличие скобок ({ и }) в одной строке или нет, могут изменить ситуацию .

0 голосов
/ 22 марта 2011

Из моего прочтения спецификации ECMAScript поведение IE правильное . Смотрите разделы:

  • 7.9.1 Правила автоматической вставки точки с запятой (которая описывает случаи, когда точка с запятой может быть вставлено, ни один из которых не применяется)

  • 12.6.1 Оператор do-while (который показывает, что ваш код не является действительным производством формы do Statement while ( Expression );

...