JS作用域链,对象函数中的变量作用域

JS scope chain, variable scope in an object function

本文关键字:作用域 变量 函数 对象 JS      更新时间:2023-09-26

我正在测试一些代码,只是为了更好地理解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)试图访问name,而name位于前一个作用域(0对象的作用域),因此沿着链路径到达上层作用域,遇到的第一个name变量就是0对象中的变量。相反,全局作用域名称变量是reference。基本上我期待的结果是"吉尔"。

如何来吗?

是否应该将console.log(name)的调用视为console.log(window.name)的调用?

显然,如果我使用console.log(this.name),吉尔将是结果,但这不是我要找的,我想知道为什么只是"name"不工作。

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

如果你想要预期的结果,将console.log(name)更改为console.log(this.name)或将this.name = "Jill"更改为var name = "Jill"