call apply bind的使用
const obj = {
name:'obj name'
}
function getName(para1,para2){
return this.name + '-'+para1+'-'+para2
}
//call 的使用
console.log(getName.call(obj,'form','call'))
//apply 的使用
console.log(getName.apply(obj,['form','call']))
//bind 的使用
var b = getName.bind(obj)
console.log(b('from','bind'))
call apply bind 的区别
相同点:都能够改变this指向
不同点:
a) call apply在使用的时候会触发运行一次,而bind只是绑定了函数,不会立即执行
b) call 与 apply 传参不同:call可以多参数;apply 是一个arguments
c) call、apply因为要立即执行函数,所以第二个参数或之后的参数都是当前的真实参数,bind是“预设参数”
应用场景
-
求数组最大值
call实现var arr = [1, 2, 3, 89, 46] var max = Math.max.call(null, arr[0], arr[1], arr[2], arr[3], arr[4])//89
注意
call 方法第一个参数是要绑定给this的值,后面传入的是一个参数列表。 当第一个参数为null、undefined的时候,默认指向window。
apply 实现
var arr = [1,2,3,89,46] var max = Math.max.apply(null,arr)//89
-
用于继承
请看JS 基础篇(五)继承方法总结 -
数组追加
apply实现//这里使用apply,它可以传递数组 var arr1 = [1,2,3]; var arr2 = [4,5,6]; var total = [].push.apply(arr1, arr2);//6 // arr1 [1, 2, 3, 4, 5, 6] // arr2 [4,5,6]
-
判断变量类型
function isArray(obj){ return Object.prototype.toString.call(obj) == '[Ojbect Array]' } isArray([]) //true isArray('kk') //false