Оценивает ли «несуществующая переменная» значение «неопределенное» в нестрогом коде? - PullRequest
3 голосов
/ 18 марта 2012

Этот абзац из книги 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, а ошибка ссылки не , генерируемая в строгом режиме.

Когда интерпретатор пытается получить значение такой ссылки (которая может или не может возникнуть в зависимости от «внешнего» выражения или оператора, в котором появляется идентификатор), ошибка ссылки равна брошено.Это поведение не отличается между строгим и строгим режимами.


Итак, верен ли абзац? Если нет, правильно ли я идентифицировал ошибку(ы)?(Также, если в моем тексте есть ошибка, пожалуйста, исправьте меня.)

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Оценивает ли «несуществующая переменная» значение «неопределенное» в нестрогом коде?

> foo;
ReferenceError: foo is not defined
> var x = foo;
ReferenceError: foo is not defined

Это поведение также верно в строгом режиме:

> (function () { "use strict"; foo; }());
ReferenceError: foo is not defined
> (function () { "use strict"; var x = foo; }());
ReferenceError: foo is not defined

Единственное различие, которое я знаю между строгим режимом и нестрогим режимом с точки зрения разрешения переменных, состоит в том, что при назначении переменной , если переменная не объявлена, в строгом режиме генерируется ReferenceError Однако в нестрогом режиме неявно создается глобальная переменная.

Приложение C (строгий режим ECMAScript):

Назначение необъявленного идентификатора или неразрешимой ссылки иным образом не создает свойства в глобальном объекте. Когда в коде строгого режима происходит простое присвоение, его LeftHandSide не должен преобразовываться в неразрешимую ссылку. Если это происходит, генерируется исключение ReferenceError (8.7.2).

0 голосов
/ 18 марта 2012

Да, даже если вы объявили это с помощью

var someVar;

все равно оценивается в undefined .

...