this指向
普通函数:this指向的是window对象
function f1(){
console.log(this)
}
f1()
//输出是window对象
构造函数:this指向的是实例化对象,原型对象里面的方法也是指向实例化对象
function F1(){
console.log(this)
}
F1.prototype.run=function(){
console.log(this)
}
var f1 = new F1()
f1.run()
//输入结果都是F1{}这个对象,所以原型对象里面的方法也是指向实例化对象
字面量对象方法调用:this指向的是方法所属对象
obj={
run:function(){
console.log(this)
}
}
obj.run()
//输入结果为 obj{run: ƒ}
事件绑定方法:this指向的是绑定事件的对象
<button>点击</button>
<script>
var btn = document.querySelector('button')
btn.onclick=function(){
console.log(this)
}
</script>
定时器方法:this指向的是window
setTimeout(function(){
console.log(this)
},0)
setInterval(function(){
console.log(this)
},1000)
//输出结果为window
立即执行函数:他和普通函数一样,this指向的window
(function(){
console.log(this)
})()
//输出结果为window
call、apply、bind三者的异同
共同点 : 都可以改变this指向
不同点:
call 和 apply 会调用函数, 并且改变函数内部this指向.
call 和 apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递
bind 不会调用函数, 可以改变函数内部this指向.
应用场景
- call 经常做继承.
- apply经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
- bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向