2015-05-19 5 views
0

Here Я нашел информацию горячей для работ цепочки областей видимости:Цепь области сначала смотрит на __parent__ или на __proto__?

... прежде чем мы перейдем к материнской ссылке, первая прото цепь считается.

Обратите внимание, что не во всех реализациях глобальный объект наследует из Object.prototype. Поведение, описанное на рисунке (с , ссылающееся на «неопределенную» переменную x из глобального контекста), может быть проведено , например. в SpiderMonkey.

Я использую Firefox браузер для тестирования, но, когда я установил глобальную переменную x, и установить его в Object.prototype собственности x и сделать a() у меня 4. Почему, если сначала пойти в proto?

var x = 1; 
Object.prototype.x = 2; 

var a = function() { 
    y = 3; 
    return this.y + this.x; 
}; 

a.x; // 2 
a(); // 4 
+0

Ваш пример кода абсолютно не имеет смысла. Почему вы ожидаете, что он даст '6' и' 15', вместо '2' и' 4', как и следовало (по общему признанию, результат 'a()' сложный)? Также этот пример нигде не упоминается на странице, которую вы связали. – Bergi

+0

Я сделал ошибку, извините –

+1

'Object.prototype.x' около последнего места JS ищет' x' – dandavis

ответ

1

Вы должны уже привел в начале этого пункта, не конец:

При выполнении кода, область применения цепи может быть дополненной использованием with о и catch оговорка объектов.

Так что ваше предложение относится к только объекту среда записи - объекты сферы, в которой переменные живут. Обычно они являются мнимыми, описанными только для целей спецификации (и могут only be observed in Rhino), но оператор with делает исключение и добавляет фактический объект JS к цепочке областей видимости.

Если вы посмотрите на пример, вы найдете инструкцию with. Суть:

Object.prototype.x = "inherited object property"; 
var x = "parent scope variable"; 
with ({}) { 
    alert(x); // you bet what it yields 
} 

Когда я установил глобальную переменную x и установить Object.prototype.x свойство, почему она не получить значение прототипа?

Используя this в функцию, которая вызывается явно (a()), вы имеете в виду глобальный объект. Это действительно объект для записи объектной среды глобальной области, что означает, что все глобальные переменные живут там как свойства.

Теперь почему доступ к x этого объекта (независимо от того, с помощью переменной x или собственности this.x) воспитывать 1 не 2? Поскольку глобальная переменная со значением 1 является собственностью объекта. Цепочка прототипа будет пройдена только в том случае, если свойство еще не найдено!