Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 04.03.2014, 09:51
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от badmitrii
я решил разобраться, почему если нигде в скрипте не объявлена переменная myvar, то в результате вычисления
myvar="mystr"
биндинг
myvar--->"mystr"
Может вот это тебе что-то прояснит...
Ответить с цитированием
  #3 (permalink)  
Старый 04.03.2014, 10:02
Новичок на форуме
Отправить личное сообщение для badmitrii Посмотреть профиль Найти все сообщения от badmitrii
 
Регистрация: 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? Можете пояснить? Спасибо! Я хочу разобраться, как это работает формально. Неформально я пониманию, что этот биндинг должен быть в глобальной области видимости.
Ответить с цитированием
  #4 (permalink)  
Старый 04.03.2014, 10:04
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от badmitrii
Можете пояснить?
Ты сначало переведи те цитаты.
Ответить с цитированием
  #5 (permalink)  
Старый 04.03.2014, 10:10
Новичок на форуме
Отправить личное сообщение для badmitrii Посмотреть профиль Найти все сообщения от badmitrii
 
Регистрация: 04.03.2014
Сообщений: 4

Блин, вот только троллинга не надо. Поясни где я ошибаюсь в своем посте если ты конечно не поленился его прочитать?
Ответить с цитированием
  #6 (permalink)  
Старый 04.03.2014, 10:26
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

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

Сообщение от badmitrii
Поясни где я ошибаюсь в своем посте
Прочитай ту ссылку - там по русски написано что и как.

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

Я тебе уже говорил, что меня интересует формальное понимание. Поясни мне по стандарту, почему так происходит и мой вопрос будет снят, неужели это так сложно? Ну если конечно ты сам читал стандарт... И потом это не огрызки англицкого текста а цитаты из спецификации. В общем очередной форум где не умеют отвечать на вопросы... жаль. Я же вроде все четко сформулировал вопрос.
Ответить с цитированием
  #8 (permalink)  
Старый 04.03.2014, 10:42
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

ksa, ты не прав. Чувак стандарт читает. И не может понять момент. А ты ему какую-то статейку для чайников суваешь.
Даже я, мля, стандарт не читал (да и вобще js урывками изучал, больше на практике).
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 04.03.2014, 11:09
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от danik.js
ты не прав
Таки я на какую-то "правоту" и не претендую...
Ответить с цитированием
  #10 (permalink)  
Старый 04.03.2014, 11:10
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто с нодой может помочь? И какой редактор посоветуете? Антон Крамолов AJAX и COMET 14 22.11.2012 20:34
При попытке передать в функцию переменную крошится скрипт feramount Общие вопросы Javascript 2 10.05.2011 14:37
"Сценарий замедляет работу IE" dmitlantis Internet Explorer 0 25.05.2010 21:38
Свойства посредством полиморфных функций tenshi Ваши сайты и скрипты 0 18.03.2010 17:12
Скрипт транслитерации skif Общие вопросы Javascript 9 19.03.2009 12:24