var x = 1;
var kit = {
x: 2,
buf: {
x: 3,
fac: function() {
return this.x;
}
}
}
var kbf = kit.buf.fac;
console.log(kbf());
console.log(kit.buf.fac());
var x = 1;
var kit = {
x: 2,
buf: {
x: 3,
fac: function() {
return this.x;
}
}
}
var kbf = kit.buf.fac;
console.log(kbf());
console.log(kit.buf.fac());
this跟代码中的位置没有关系,是在执行时赋值的。也就是说this只存在于函数调用(运行)期间,在变量作用域中是不存在的。
分析this时,不能看代码位置来确定,要看怎么调用的。
this是在函数运行期赋值的,这步由JavaScript引擎来做,如果函数内的this为undefined
,则使 this = window
。
具体为下面的情景:
普通函数调用,this为全局对象或是undefined(kbf() 显然是普通函数调用,属于这种情况)
作为对象的方法,this为那个对象(kit.buf.fac() 属于这种情况,fac中的this指向kit.buf对象)
new 表达式,this为以该函数为原型的新创建的对象
使用 apply/call指定 this
用bind绑定固定的this
事件处理函数中的this是当前的触发事件的DOM元素(event.currentTarget)
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
这其实是函数运行时
this
的指向问题,第一个console
里this
指向的是window
,x
肯定就是全局变量var x = 1
,第二个console
里,this
指向kit
这个对象里的buf
对象,x
的值自然就是3了。你只需要像下面代码这样把
this
打印出来就看得一清二楚了: