JS作用域链,对象函数中的变量作用域
JS scope chain, variable scope in an object function
我正在测试一些代码,只是为了更好地理解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"
。
相关文章:
- 当我更新另一个作用域变量时,作用域变量会自动更新
- 如何在隔离作用域指令中访问此作用域变量
- 正在向构造函数添加作用域变量
- 如何在angularjs中将多个作用域变量传递到自定义指令中
- 作用域变量未从状态父控制器继承到子控制器
- 插槽:访问作用域变量
- 在另一个作用域变量中使用AngularJS作用域变量
- 在Angular.js中通过检查作用域变量进行过滤
- 如何更新作为属性传入的作用域变量
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 从$http.get调用更新Angular作用域变量
- AngularJS ui路由器:访问子作用域变量
- 访问AngularJS中函数中的作用域变量
- 为什么Angular 1.5双向绑定在将作用域变量传递给组件绑定时失败
- 修改作用域变量后,未更新作用域绑定
- 控制器作用域变量在刷新之前未加载
- 将Angular作用域变量的字符串描述传递给指令
- 将内部作用域变量绑定到外部“模板”
- 无法在 $.post 回调中设置作用域变量
- 如何从在 JS 中用作参数的匿名函数中分配外部作用域变量