2013-12-21 3 views
0

Пусть у нас есть простой скрипт:разрешения Identifier и простое задание

obj=new String('str');//1 
obj.length;//2 

В строке 1 мы имеем простое задание, которое вычисляется следующим образом:

  1. Оценка ПервичноеВыражения: идентификатор (obj в моем случае). (undefined, obj, false) будет возвращен как результат.
  2. Оценка NewExpression new String('str');. Обозначим результат evalution от rref
  3. GetValue(rref)
  4. Ввод значения получения на шаге 3, приведенной в справочном получения на шаге 1.
  5. Обратный результат шага 4.

На этой линии obj-->'str' привязок Doesnt добавить к среде запись любого исполнения. Но когда objPrimaryExpression:Identifier будет оцениваться как ('str', obj, false) типа Refernce, и мы можем получить свойство 'str' по этой ссылке.

Вопрос:

Почему PrimaryExpression:Identifierobj в строке 2 будет оцениваться как ('str', obj, false)?

ответ

1

Это необычный вопрос для SO, но, тем не менее, интересный.

Ответ на ваш вопрос заключается в том, что он добавляется в глобальный контекст выполнения (при условии, что этот скрипт является всей программой).

См. ecma spec section regarding Programs.

Шаг 3 устанавливает контекст выполнения для глобального кода, и именно этот контекст, в котором первоначально ссылается obj, и который операция PutValue устанавливает привязку на шаге 4 выше.

+0

Точно, 'PutValue (V, W)' где 'IsUnresolvedReference (V)' возвращает 'true' добавленное свойство для глобального объекта с' GetReferencedValue (V) 'как имя свойства и' W' как значение. Запись окружения глобального объекта - это запись об объектной среде, поэтому добавление свойств к «глобальному» добавляет соответствующую привязку. Надеюсь, теперь мое понимание правильное. –

Смежные вопросы