04.03.2014, 09:38
|
Новичок на форуме
|
|
Регистрация: 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 и base value
undefined
. А далее, при вызове
мы должны будем по идее получить
, так как значение
LexicalEnvironment
есть
undefined
Последний раз редактировалось badmitrii, 04.03.2014 в 09:42.
|
|
04.03.2014, 09:51
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,217
|
|
Сообщение от badmitrii
|
я решил разобраться, почему если нигде в скрипте не объявлена переменная myvar, то в результате вычисления
myvar="mystr"
биндинг
myvar--->"mystr"
|
Может вот это тебе что-то прояснит...
|
|
04.03.2014, 10:02
|
Новичок на форуме
|
|
Регистрация: 04.03.2014
Сообщений: 4
|
|
Спасибо за ответ, но я не понимаю почему
в этом пункте:
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.
возвращаем ссылку с со значением undefined а не global environment record? Можете пояснить? Спасибо! Я хочу разобраться, как это работает формально. Неформально я пониманию, что этот биндинг должен быть в глобальной области видимости.
|
|
04.03.2014, 10:04
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,217
|
|
Сообщение от badmitrii
|
Можете пояснить?
|
Ты сначало переведи те цитаты.
|
|
04.03.2014, 10:10
|
Новичок на форуме
|
|
Регистрация: 04.03.2014
Сообщений: 4
|
|
Блин, вот только троллинга не надо. Поясни где я ошибаюсь в своем посте если ты конечно не поленился его прочитать?
|
|
04.03.2014, 10:26
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,217
|
|
Сообщение от badmitrii
|
вот только троллинга не надо
|
У тебя мания?
Сообщение от badmitrii
|
Поясни где я ошибаюсь в своем посте
|
Прочитай ту ссылку - там по русски написано что и как.
Сообщение от badmitrii
|
если ты конечно не поленился его прочитать?
|
Мне не нужны твои огрызки аглицкого текста. Мне для понимания достаточно было аналогов той статьи...
|
|
04.03.2014, 10:42
|
Новичок на форуме
|
|
Регистрация: 04.03.2014
Сообщений: 4
|
|
Я тебе уже говорил, что меня интересует формальное понимание. Поясни мне по стандарту, почему так происходит и мой вопрос будет снят, неужели это так сложно? Ну если конечно ты сам читал стандарт... И потом это не огрызки англицкого текста а цитаты из спецификации. В общем очередной форум где не умеют отвечать на вопросы... жаль. Я же вроде все четко сформулировал вопрос.
|
|
04.03.2014, 10:42
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
ksa, ты не прав. Чувак стандарт читает. И не может понять момент. А ты ему какую-то статейку для чайников суваешь.
Даже я, мля, стандарт не читал (да и вобще js урывками изучал, больше на практике).
__________________
В личку только с интересными предложениями
|
|
04.03.2014, 11:09
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,217
|
|
Сообщение от danik.js
|
ты не прав
|
Таки я на какую-то "правоту" и не претендую...
|
|
04.03.2014, 11:10
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,217
|
|
Сообщение от badmitrii
|
Ну если конечно ты сам читал стандарт...
|
Нет, не читал.
Сообщение от badmitrii
|
В общем очередной форум где не умеют отвечать на вопросы... жаль.
|
Ты еще заплачь...
|
|
|
|