call与apply方法都是改变函数体内的this指向,即改变函数运行时的上下文。若没有什么对象调用这个方法,所以第一个参数可以写作null或者本身;
在call与apply方法中,第一个参数就是this的指向,但apply第二个参数是一个数组,call第二个及以后直接是数组中里面的元素。
call与apply常用法
- 数组之间的追加
- 获取数组中的最大值和最小值,利用Math的min和max方法
1
2let arr = [1,2,3,4];
Math.max.apply(null, arr) // 5 - 验证是否是数组(前提是toString()方法没有被重写过)
1
2
3function isArray(obj){
return Object.prototype.toString.call(obj) === '[object Array]' ; // true or false
}
bind()
bind()也是改变函数体内this的指向,bind会创建一个新函数,该函数不会立即执行,需要自己手动调用执行。
三个的使用区别
- 都是用来改变函数的this对象的指向的
- 第一个参数都是this要指向的对象
- 都可以利用后续参数传参
- bind是返回对应函数,便于稍后调用,apply、call是立即调用