Инструкция:
this.x = 100;
Не создает переменную в текущей области, она устанавливает свойство x
для любого объекта, на который ссылается this
.В вашем случае this
будет объектом, только что созданным с помощью new f
, тем же объектом, который будет возвращен f
и назначен на a
.
Когда вы скажете:
x = 20;
JavaScript ищет x
в текущей области и не находит его, поэтому он просматривает следующую область и т. Д. До тех пор, пока не достигнет глобальной области.Если он не находит x
в какой-либо доступной области, он создает новую глобальную переменную, как вы видели.
Чтобы получить доступ к свойству x
из вложенной функции, обычной практикой является сохранение ссылкина this
в локальной переменной, а затем вложенная функция может ссылаться на эту переменную:
var f = function() {
var self = this; // keep a reference to this
this.x = 100;
(
function() {
self.x = 20; // use the self reference from the containing scope
}
)();
};
var a = new f;
console.log(a.x); // will now be 20
Другой способ сделать это - сослаться на this.x
во внутренней функции, при условии, что вы вызываете внутреннюю функциюс помощью метода .call()
, чтобы вы могли явно установить this
таким же, как в (внешней) функции f
:
var f = function() {
this.x = 100;
(
function() {
this.x = 20;
}
).call(this);
};
var a = new f;
console.log(a.x);
Дальнейшее чтение: