该声明:
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()
this
f
var f = function() {
this.x = 100;
(
function() {
this.x = 20;
}
).call(this);
};
var a = new f;
console.log(a.x);
进一步阅读: