该声明:
this.x = 100;
不在当前范围内创建变量,它x在任何对象this所指的对象上设置一个属性。在您的情况下this,将是刚刚通过 实例化的对象new f,该对象将由 . 返回f并分配给a.
当你说:
x = 20;
JavaScriptx在当前作用域中查找 a 并没有找到它,所以它在下一个作用域中查找,依此类推,直到它到达全局作用域。如果它在任何可访问的范围内都找不到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()thisf
var f = function() {
this.x = 100;
(
function() {
this.x = 20;
}
).call(this);
};
var a = new f;
console.log(a.x);
进一步阅读: