this是包含它的函数作为方法被调用时所属的对象。
说明:这句话有点咬嘴,但一个多余的字也没有,定义非常准确,我们可以分3部分来理解它!
1、包含它的函数。2、作为方法被调用时。3、所属的对象。
全局下的 this 指向window
下面我们来看个小案例
function a(){
var user = "hai";
console.log(this.user); //undefined
console.log(this); //Window
}
a(); //此处相当于window.a(),window是可以省略的
这仅是我个人的理解
在这个代码中我们可以看出在代码的结尾是由window来调用的函数a,那么这个时候this指向window,this.user,全局中没有user,所以打印出undefined。
接下来我们再看
var fn = {
user:"美少女",
newfn:function(){
console.log(this.user); //美少女
}
}
fn.newfn();
在这里我们可以看到,因为我们调用这个newfn是通过fn.newfn()执行的,所以此时this指向fn对象,所以这个this.user就是 fn.user,所以打印出“美少女”
接下来重点来了,我们怎么改变this指向呢?
改变this指向可以通过:1.call() 2.apply() 3.bind()这三个方法
这三个方法在使用中有些不同
<script>
var a = '个'
var obj = {
a:this.a,
fn: function(e,f){
console.log(`${e}是${this.a}${f}`)
}
}
obj.fn('你','美少女');//你是个美少女
var obj2 = {
a:'只'
}
obj.fn.call(obj2,'欢欢','可爱的狗');//欢欢是只可爱的狗
obj.fn.bind(obj2,'尿尿','有趣的猫')();//尿尿是只有趣的猫
obj.fn.apply(obj2,['哈尼','小机灵鬼']);//哈尼是只小机灵鬼
</script>
通过上面的这个小案例我们可以看出:
1.call方法,改变this指向后,可以直接传参,逗号隔开
2.bind方法和call方法很相似,改变this指向后,可以直接传参,逗号隔开,但是最后要加()自执行
3.apply方法,改变this指向后,需要以数组的形式传入实参
上面都是我自己的一些理解,有不对不好的地方欢迎大家一起来探讨!:-)
网友评论