我正在测试一些代码,只是为了更好地理解JS中的变量范围链。 我已经设置了2个类似的对象构造函数,其中包含一个从前一个作用域调用变量的函数。 根据我的理解,我得到的结果是出乎意料的。
var name = "Outter!";
var o = new function () {
this.name = "Jill";
this.age = 23;
this.func = function () {
console.log(name);
}
}
//output to console for: o.func()// Outter!
根据我的理解,我没想到这个结果。由于console.log(name)正在尝试访问名称,并且名称位于前一个作用域(对象的作用域)中,因此遵循上部作用域的链路径,满足的第一个名称变量是o对象中的一个。相反,全局范围名称变量是引用。基本上我期待结果“吉尔”。
怎么回事?
是否应将console.log(name)的调用视为对console.log(window.name)的调用?
很明显,如果我使用console.log(this.name),Jill将是结果,但这不是我想要的,我想知道为什么只是“名称”不起作用。
答案 0 :(得分:0)
this.name = "Jill"
没有声明名为name
的变量。相反,它在对象实例上定义了一个名为name
的键(由new
运算符创建),并将其值设置为Jill
。
如果您需要预期结果,请将console.log(name)
更改为console.log(this.name)
或将this.name = "Jill"
更改为var name = "Jill"
。