为什么在代码示例中' this '不是指向js全局作用域
Why `this` is not point to js global scope in the code example
为什么this
在下面的代码中没有指向js的全局作用域?
<html>
<head></head>
<body>
<script type="text/javascript">
var valueHolder = {
value: '',
setValue: function(newValue) {
this.value = newValue;
},
getValue: function() {
return this.value;
}
}
valueHolder.setValue("hello world");
alert(valueHolder.getValue()); // return "hello world"
alert(valueHolder.value); // return "hello world"
alert(window.value); // return "undefined"
</script>
</body>
</html>
取决于对函数的引用(参见规范的11.2.3):
var valueHolder = {
value: '',
setValue: function(newValue) {
this.value = newValue;
},
getValue: function() {
return this.value;
}
}
var set = valueHolder.setValue,
get = valueHolder.getValue;
set('test');
alert(get()); // return "test"
alert(valueHolder.value); // return ""
alert(window.value); // return "test"
当在上下文中引用时,this
被设置为相关上下文(在您的示例中为valueHolder
)。在我上面的例子中,函数定义显然是相同的,但是函数引用不在任何对象的上下文中,在这种情况下,this
被设置为全局上下文中(window
)。
返回undefined,因为value是对象内部的键,在window对象中不可见。您将使用
访问window.valueHolder.value
(要清楚,在你的代码this
关键字是指valueHolder对象)
为什么你认为它会是全局作用域?
当一个对象有一个引用函数的属性时,你可以使用点符号来调用这个函数:
valueHolder.getValue();
然后在函数中JavaScript自动将this
设置为对象。
相关文章:
- Angularjs:修改js中的作用域,稍后在页面中使用
- 访问Javascript对象-Node.js的作用域问题
- Node.js作用域错误
- dust.js:在作用域部分中使用路径
- 在Angular.js中通过检查作用域变量进行过滤
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- Angular.js-从指令更新父作用域
- 如何在angular.js中为http控制器添加作用域
- JavaScript 作用域和 Angular JS 作用域之间的区别是什么?
- 如何从在 JS 中用作参数的匿名函数中分配外部作用域变量
- iframe 中的 Angular js 作用域变量值
- 需要define()中具有Backbone.js作用域的.js
- JS作用域链,对象函数中的变量作用域
- JS作用域中对象文字中的未定义变量
- “Writing"在HTML页面中使用JS和JS作用域
- JS作用域约定用于第三个(或更多)嵌套作用域
- 我怎么能得到自己的范围在定义模块在require.js?作用域是'this'我希望它是模块本身
- 如何正确地销毁Paper.js作用域
- Angular JS $作用域、数据绑定和变量变化
- JS作用域/引用问题