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

Javascript JS作用域链,对象函数中的变量作用域,javascript,function,object,scope,this,Javascript,Function,Object,Scope,This,我测试了一些代码,只是为了更好地理解JS中的变量范围链。 我已经设置了两个类似的对象构造函数,其中包含一个调用前一个作用域中变量的函数。 从我的理解来看,我得到的结果是出乎意料的 var name = "Outter!"; var o = new function () { this.name = "Jill"; this.age = 23; this.func = function ()

我测试了一些代码,只是为了更好地理解JS中的变量范围链。 我已经设置了两个类似的对象构造函数,其中包含一个调用前一个作用域中变量的函数。 从我的理解来看,我得到的结果是出乎意料的

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位于前一个作用域(o对象的作用域)中,因此在上一个作用域的链路径之后,遇到的第一个name变量就是o对象中的变量。相反,全局作用域名称变量是reference。基本上,我期待的结果是“吉尔”

为什么

对console.log(name)的调用是否应视为对console.log(window.name)的调用

显然,如果我使用console.log(this.name),Jill将是结果,但这不是我要寻找的,我想知道为什么“name”不起作用。

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


如果希望得到预期结果,请将
console.log(name)
更改为
console.log(this.name)
或将
this.name=“Jill”
更改为
var name=“Jill”

this.name使其成为函数的属性,而不是变量。因此,它与范围链无关。您定义的唯一名称变量是Outter。此外,您也不应该*在那里使用
new
,您只需要var o=function(){/…@chiliNUT,然后他需要使用
o().func()
@Barmar:
(new o).func()相反,他只是将这两个操作合并为一个操作。对于值为函数的变量,您可以使用匿名函数本身执行任何操作。
this.name
也不起作用,因为
this
没有保存在闭包中。@Barmer它会起作用。当您在构造函数中指定一个方法时,他s、 上下文已绑定。请参阅: