Показать сообщение отдельно
  #1 (permalink)  
Старый 04.03.2014, 09:38
Новичок на форуме
Отправить личное сообщение для badmitrii Посмотреть профиль Найти все сообщения от badmitrii
 
Регистрация: 04.03.2014
Сообщений: 4

Теор.вопрос по ECMA-262: Почему переменные, объявленные без var- глобальные?
Привет, уважаемые джаваскриптеры! Я постараюсь наиболее полно описать, что у меня вызывает неясности. Читая стандарт 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
будет ссылка с именем myvar и base value
undefined
. А далее, при вызове
Код:
[[Put]]
мы должны будем по идее получить
Код:
TypeError
, так как значение
LexicalEnvironment
есть
undefined

Последний раз редактировалось badmitrii, 04.03.2014 в 09:42.
Ответить с цитированием