Этот абзац из книги JavaScript: Полное руководство, 6-е издание , стр. 58:
Когда в программе появляется какой-либо идентификатор, JavaScript предполагает, что онпеременная и ищет ее значение.Если переменная с таким именем не существует, выражение оценивается как значение undefined
.В строгом режиме ECMAScript 5, однако, при попытке оценить несуществующую переменную вместо этого выдается ReferenceError.
Сначала позвольте мне объяснить, как я интерпретирую некоторые фразы, использованные в абзаце,
" ... идентификатор появляется сам по себе в программе, ... ":
Я предполагаю, что автор имеет в виду случай, когдаидентификатор анализируется как выражение (в этом случае выполняется разрешение идентификатора).Например:
function func ( arg ) {
var local = helper( arg );
}
Здесь func
, arg
(который появляется дважды), local
и helper
- все идентификаторы, но только helper
и arg
(только вего второе появление!) являются выражениями.Таким образом, только эти два идентификатора могут вызвать ошибку ссылки.
" ... переменная с таким именем не существует ... " и " несуществующая переменная":
Полагаю, автор подразумевает идентификатор, который оценивается как неразрешимая ссылка.
Теперь поправьте меня, если я ошибаюсь, но ...
При оценке идентификатора, который анализируется как выражение (точнее a PrimaryExpression
), выполняется разрешение идентификатора.Результатом этого процесса всегда является значение типа Reference.Другими словами, идентификатор будет ссылаться на ссылку.
Ссылка имеет базовое значение и имя, на которое ссылаются.Указанное имя - это текст идентификатора, а базовое значение - запись среды, имеющая привязку для этого имени (область действия, содержащая такую переменную).Однако, если при разрешении идентификатора не удается разрешить указанное имя, базовое значение ссылки будет равно undefined
.
Таким образом, "несуществующая переменная", следовательно, оценивает ссылку, базовое значение которой равно undefined
.
Обратите внимание, что вычисление несуществующей переменной не приводит к ошибке ссылки.Ошибка появляется позже, когда интерпретатор получает значение ссылки (через GetValue()
).Это, однако, может происходить не всегда - например, typeof x
не будет извлекать значение ссылки, если x
оценивается как неразрешимая ссылка, и, следовательно, ошибка ссылки не выдается.
В параграфе, приведенном в начале моего вопроса, говорится, что в нестрогом коде несуществующие переменные оцениваются как undefined
, тогда как при строгой оценке кода такой идентификатор выдает ошибку ссылки.Я считаю, что оба эти утверждения неверны - несуществующая переменная оценивает ссылку с базовым значением undefined
, а ошибка ссылки не , генерируемая в строгом режиме.
Когда интерпретатор пытается получить значение такой ссылки (которая может или не может возникнуть в зависимости от «внешнего» выражения или оператора, в котором появляется идентификатор), ошибка ссылки равна брошено.Это поведение не отличается между строгим и строгим режимами.
Итак, верен ли абзац? Если нет, правильно ли я идентифицировал ошибку(ы)?(Также, если в моем тексте есть ошибка, пожалуйста, исправьте меня.)