JS范围链,对象函数中的变量范围

时间:2014-08-07 23:12:27

标签: javascript function object scope this

我正在测试一些代码,只是为了更好地理解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将是结果,但这不是我想要的,我想知道为什么只是“名称”不起作用。

1 个答案:

答案 0 :(得分:0)

this.name = "Jill"没有声明名为name的变量。相反,它在对象实例上定义了一个名为name的键(由new运算符创建),并将其值设置为Jill

如果您需要预期结果,请将console.log(name)更改为console.log(this.name)或将this.name = "Jill"更改为var name = "Jill"