Привет, уважаемые джаваскриптеры! Я постараюсь наиболее полно описать, что у меня вызывает неясности. Читая стандарт ECMA-262 я решил разобраться, почему если нигде в скрипте не объявлена переменная
myvar
, то в результате вычисления
myvar="mystr"
биндинг
myvar--->"mystr"
будет записан в LexicalEnvironment глобального ExecutionContext?
Для начала, посмотрю как вычисляется присваивание:
Код:
|
The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:
1. Let lref be the result of evaluating LeftHandSideExpression.
2. Let rref be the result of evaluating AssignmentExpression.
3. Let rval be GetValue(rref).
4. Throw a SyntaxError exception if the following conditions are all true:
Type(lref) is Reference is true
IsStrictReference(lref) is true
Type(GetBase(lref)) is Environment Record
GetReferencedName(lref) is either "eval" or "arguments"
5. Call PutValue(lref, rval).
6. Return rval. |
lref
в моем случае это результат вычисления
myvar
.
Код:
|
1. Let env be the running execution context‘s LexicalEnvironment.
2. If the syntactic production that is being evaluated is contained in a strict mode code, then let strict be true,
else let strict be false.
3. Return the result of calling GetIdentifierReference function passing env, Identifier, and strict as arguments. |
а
Код:
|
GetIdentifierReference |
работает так:
Код:
|
The abstract operation GetIdentifierReference is called with a Lexical Environment lex, an identifier String
name, and a Boolean flag strict. The value of lex may be null. When called, the following steps are performed:
1. If lex is the value null, then
a. Return a value of type Reference whose base value is undefined, whose referenced name is name,
and whose strict mode flag is strict.
2. Let envRec be lex‘s environment record.
3. Let exists be the result of calling the HasBinding(N) concrete method of envRec passing name as the
argument N.
4. If exists is true, then
a. Return a value of type Reference whose base value is envRec, whose referenced name is name, and
whose strict mode flag is strict.
5. Else
a. Let outer be the value of lex’s outer environment reference.
b. Return the result of calling GetIdentifierReference passing outer, name, and strict as arguments. |
то получаем, что результатом вычисления
будет ссылка с именем myvar и base value
undefined
. А далее, при вызове
мы должны будем по идее получить
, так как значение
LexicalEnvironment
есть
undefined