Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Теор.вопрос по ECMA-262: Почему переменные, объявленные без var- глобальные? (https://javascript.ru/forum/misc/45519-teor-vopros-po-ecma-262-pochemu-peremennye-obyavlennye-bez-var-globalnye.html)

badmitrii 04.03.2014 09:38

Теор.вопрос по 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

ksa 04.03.2014 09:51

Цитата:

Сообщение от badmitrii
я решил разобраться, почему если нигде в скрипте не объявлена переменная myvar, то в результате вычисления
myvar="mystr"
биндинг
myvar--->"mystr"

Может вот это тебе что-то прояснит...

badmitrii 04.03.2014 10:02

Спасибо за ответ, но я не понимаю почему
в этом пункте:
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? Можете пояснить? Спасибо! Я хочу разобраться, как это работает формально. Неформально я пониманию, что этот биндинг должен быть в глобальной области видимости.

ksa 04.03.2014 10:04

Цитата:

Сообщение от badmitrii
Можете пояснить?

Ты сначало переведи те цитаты. :D

badmitrii 04.03.2014 10:10

Блин, вот только троллинга не надо. Поясни где я ошибаюсь в своем посте если ты конечно не поленился его прочитать?

ksa 04.03.2014 10:26

Цитата:

Сообщение от badmitrii
вот только троллинга не надо

У тебя мания? :blink:

Цитата:

Сообщение от badmitrii
Поясни где я ошибаюсь в своем посте

Прочитай ту ссылку - там по русски написано что и как.

Цитата:

Сообщение от badmitrii
если ты конечно не поленился его прочитать?

Мне не нужны твои огрызки аглицкого текста. Мне для понимания достаточно было аналогов той статьи...

badmitrii 04.03.2014 10:42

Я тебе уже говорил, что меня интересует формальное понимание. Поясни мне по стандарту, почему так происходит и мой вопрос будет снят, неужели это так сложно? Ну если конечно ты сам читал стандарт... И потом это не огрызки англицкого текста а цитаты из спецификации. В общем очередной форум где не умеют отвечать на вопросы... жаль. Я же вроде все четко сформулировал вопрос.

danik.js 04.03.2014 10:42

ksa, ты не прав. Чувак стандарт читает. И не может понять момент. А ты ему какую-то статейку для чайников суваешь.
Даже я, мля, стандарт не читал (да и вобще js урывками изучал, больше на практике).

ksa 04.03.2014 11:09

Цитата:

Сообщение от danik.js
ты не прав

Таки я на какую-то "правоту" и не претендую... :D

ksa 04.03.2014 11:10

Цитата:

Сообщение от badmitrii
Ну если конечно ты сам читал стандарт...

Нет, не читал. :no:

Цитата:

Сообщение от badmitrii
В общем очередной форум где не умеют отвечать на вопросы... жаль.

Ты еще заплачь...


Часовой пояс GMT +3, время: 04:10.