用法:
都是Function.prototype的方法,具有相同的作用:
修改this指向!!!
接收的第一个参数都是新的this指向对象,不同在于后续的参数:
不同点:
1.call和apply会立即执行,bind会返回一个函数,需要进一步出发或者添加()立即触发
var a = 1
let obj = {
a:2
}
function fun(){
console.log(this.a)
}
fun() //this指向window对象,因此输出1
fun.call(obj) // 2
fun.apply(obj) // 2
fun.bind(obj)() //2,由于返回一个函数,需要添加()立即执行
2.call和bind将剩余参数陈列出来,apply将剩余参数放入一个数组
function add(c,d){
return this.a + this.b + c + d
}
let obj = { a:1 , b:3 }
add.call(obj,5,7) //1+3+5+7 = 16
add.bind(obj,5,7)() //1+3+5+7 = 16
add.apply(obj,[10,20]) //1+3+10+20 = 34
用途:
1.通常情况下可以用call直接完成任务
2.当待使用的数据为数组时,考虑apply
let arr = [1,2,4,3]
// Math.max(1,2,4,3) //找出最大值4
//改变写法
Math.max.apply(null,arr) //将arr直接拿来用
3.当为绑定事件修改this指向,等待下一个时机出发时
let btn = document.getElementById("btn")
let obj = {
b:1
}
btn.onclick = function(){
console.log(this.b)
}.bind(obj)
//以上正好利用了bind返回一个函数的特性,在用户点击之后才执行