this指向问题

var x = 1;
var kit = {
    x: 2,
    buf: {
        x: 3,
        fac: function() {
            return this.x;
        }
    }
}
var kbf = kit.buf.fac;
console.log(kbf());//1
console.log(kit.buf.fac());//3
不明白这两个的区别?kbf()调用的this指向什么?kit.buf.fac()的this指向什么?
求大神们赐教

阅读 4.2k
8 个回答

首先你全局定义了kbf,此时它的执行环境是window也就是全局,那么当你把kit.buf.fac赋给kbf的时候,通过kbf去调用这个对象的时候,fac这个函数的执行环境也就变成了window,那么当执行return this.x的时候,浏览器会去查找全局的x而不是kit的局部x。
而当你通过buf去调用它的属性fac的时候,因为buf是kit内部的一个属性,执行环境在kit内,那么当执行到return this.x的时候,它会先在内部找x,如果内部无x,则会找外部,直到全局。在这里,内部有局部x,所以返回的是局部x的值。
这是我直接的理解,可能有些地方说的不对,能理解最好把。建议你去看看高程的this和你不知道的this

非严格模式下
kbf() this指向window,因为本质上就是window调用的kbf()

kit.buf.fac this指向调用者kit.buf,因为本质上就是kit.buf调用的fac()

弄懂概念:在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。如果调用者函数,被某个对象拥有,那么该函数在调用时,内部this指向该对象。如果函数独立调用,那么该函数内部的this指向window,严格模式下为undefined。
问题中的kbf()是独立调用,内部的this肯定是指向window啦,而对应的kit.buf.fac()调用者是kit.buf,那结果是很显然的。

等同于

var kbf =  function() {
            return this.x;
        };
kbf() //1

kbf()调用的this指向什么?
window
kit.buf.fac()的this指向什么?
kit.buf

this指向直接调用他的那个对象。

前者指向window,后者指向buf.
js的this 初始是均指向window对象 ,你这里的kbf等同 window.kbf=kit.buf.fac= function() {

                                                                        return this.x;
                                                                       }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题