this的指向问题

50 阅读1分钟

关于this的指向,通俗说法是“谁调用它,this就指向谁”
没问题,但不全面,this的指向规律有以下几条:

  • 在函数体中,非显式或隐式的简单调用函数时,在严格模式下,函数内的this会被绑定到undefined上,在非严格模式下则会绑定到全局对象window/global上
  • 一般使用new方法调用构造函数时,构造函数的this会被绑定到新创建的对象上
  • 一般通过call/apply/bind方法显式调用函数时,函数体内的this会被绑定到指定参数的对象上
  • 一般通过上下文对象调用函数时,函数体内的this会被绑定到该函数对象上。
  • 在箭头函数中,this的指向是由外层作用域来决定的。

例题1:

var foo = {
    bar: 10,
    func() {
        console.log(this);
        console.log(this.bar);
    }
}
var fn2 = foo.func;

fn2(); // this指向window

例题2:

var stu = {
    name: "zhangsan",
    son: {
        name: "zhangxiaosan",
        fn(){
            return this.name;
        }
    }
}
console.log(stu.son.fn()); // zhangxiaosan

例题3:

var o1 = {
    text: "o1",
    fn(){
        return this.text;
    }
}

var o2 = {
    text: "o2",
    fn() {
        return o1.fn();
    }
}

var o3 = {
    text: "o3",
    fn(){
        var fn2 = o1.fn;
        return fn2(); // 这里相当于普通函数的调用
    }
}

console.log(o1.fn()); // o1
console.log(o2.fn()); // o1
console.log(o3.fn()); // undefined

this 指向绑定事件的元素
DOM元素绑定事件时,事件处理函数里面的 this指向绑定了事件的元素