this

 

this理论

1、对于直接调⽤的函数来说,不管函数被放在了什么地⽅,this都是window

2、对于被别⼈调⽤的函数来说,被谁点出来的,this就是谁

3、在构造函数中,类中(函数体中)出现的this.xxx=xxx中的this是当前类的⼀个实例

4、call、apply时,this是第⼀个参数。bind要优与call/apply哦,call参数多,apply参数少

5、箭头函数没有⾃⼰的this,需要看其外层的是否有函数,如果有,外层函数的this就是内部箭头函数的this,如果没有,则this是window

场景1: 函数直接调⽤时

function myfunc() {
    console.log(this) // this是widow
}
var a = 1;
myfunc();

场景2: 函数被别⼈调⽤时

function myfunc() {
    console.log(this) // this是对象a
}
var a = {
    myfunc: myfunc
};
a.myfunc();

场景3: new⼀个实例时

function Person(name) {
    this.name = name;
    console.log(this); // this是指实例p
}
var p = new Person('zhaowa');

场景4: apply、call、bind时

function getColor(color) {
    this.color = color;
    console.log(this);
}
function Car(name, color){
    this.name = name; // this指的是实例car
    getColor.call(this, color); // 这⾥的this从原本的getColor,变成了car
}
var car = new Car('卡⻋', '绿⾊');

场景5: 箭头函数时

// 复习⼀下场景1
var a = {
    myfunc: function() {
        setTimeout(function(){
            console.log(this); // this是a
        }, 0)
    }
};
a.myfunc();
// 稍微改变⼀下
var a = {
    myfunc: function() {
        var that = this;
        setTimeout(function(){
            console.log(that); // this是a
        }, 0)
    }
};
a.myfunc();
// 箭头函数
var a = {
    myfunc: function() {
        setTimeout(() => {
            console.log(this); // this是a
        }, 0)
    }
};
a.myfunc();

小测一下

function show () {
    console.log('this:', this);  // obj
}
var obj = {
    show: show
};
obj.show();

function show () {
    console.log('this:', this);  // window
}
var obj = {
    show: function () {
        show();
    }
};
obj.show();
var obj = {
    show: function () {
        console.log('this:', this);  // window
    }
};
// 逗号表达式返回括号中最后面那个值,也就是obj.show
(0, obj.show)();
var obj = {
    sub: {
        show: function () {
            console.log('this:', this); // sub
        }
    }
};
obj.sub.show()
var obj = {
    show: function () {
        console.log('this:', this); // newobj
    }
};
var newobj = new obj.show();
var obj = {
    show: function () {
        console.log('this:', this);  // newobj
    }
};
// new 和 bind 都会改变this指向,但是new的优先级高于bind
var newobj = new (obj.show.bind(obj))();
var obj = {
    show: function () {
        console.log('this:', this);
    }
};
var elem = document.getElementById('book-search-results');
// window点击事件,触发obj.show,相当于window直接调用了obj.show里面的方法
elem.addEventListener('click', obj.show);  // window
elem.addEventListener('click', obj.show.bind(obj)); // obj
elem.addEventListener('click', function () {
    obj.show();  // obj
});

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值