我只是在JS中尝试使用作用域和这个关键字,在编写下面的代码时我真的很困惑,因为我在调用console.log(a)
为f()
之后期待5
,而是它给了我10
。
我的问题是:
this
关键字是指window
?window.a = 5
相同
并且a
的值应更新为5
?console.log(this)
会产生窗口,而a
的值会产生var a = 10;
function f(){
this.a = 5;
console.log(a);
}
console.log(a);
f();
console.log(a);
是全球的)还没有更新?{{1}}
答案 0 :(得分:9)
如果代码在全局范围内运行,那么它将产生您期望的结果。你的jsFiddle的问题是它不在全局范围内运行。因此var a;
创建本地变量a
,而this.a
引用全局变量a
。
以下是您在全球范围内运行的代码:http://jsfiddle.net/grayoork/(请注意"无包装 - ...")设置。
参考:MDN - this
。
因此,var a;
和this.a
都将引用相同的变量iff:
this
在f
内引用全局对象,如果是这样的话
f
执行为f()
且未绑定,或绑定到全局对象f
未处于严格模式。答案 1 :(得分:1)
这是JSFiddle特有的,因为它们包装了它们的功能。如果您使用Chrome控制台,并点击要记录的文件,则会获得除代码之外的其他内容。这是正在执行的实际JS:
window.onload=function(){
var a = 10;
function f(){
this.a = 5;
console.log(this);
}
console.log(a);
f();
console.log(a);
}
现在很清楚发生了什么 - a
根本不是全球性的!它的范围是onload函数。
答案 2 :(得分:0)
这指的是当前上下文 - 查看javascript调用并应用可以切换上下文的函数 在函数中,这指的是函数,除非以设置上下文的方式调用函数,例如someobject.function()或通过使用call或apply
答案 3 :(得分:-1)
如果在函数内部使用this
,则其范围仅适用于该函数。因此var a = 10;
和this.a = 5
是两个不同的变量。