call和apply是什么
call 和 apply 在日常开发中经常用到,他们的作用都是改变this的指向,或者说是借用方法。
形式:
func.call(thisArg,param1,param2…)
func.apply(thisArg,[param1,param2…])
参数:
thisArg(可选):
func的this将指向thisArg;非严格模式下若thisArg指定为null或是undefined,则func的this指向window对象。严格模式下若thisArg指定为nul1或是undefined,则func的this指向undefined;
param(可选):如果不传该参数或是传入null或undefined,则表示不传入任何参数;apply的第二个参数为类数组对象,传入func的参数是数组内各项的值;
call和apply本质上来说并没有什么区别,作用都是一致的,它们的差别体现在传入给func的参数不同,call是多次传入要使用的参数,而apply传入的是一个包含要使用参数的类数组。
通俗解释:
function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替function类里this对象
args:这个是数组,它将作为参数传给function
1、apply、call示例
let obj = {
name: '小王',
sayName: function() {
console.log(this);
console.log(this.name);
}
}
let obj2 = {
name: '小张',
age: 22
}
obj.sayName.apply(obj2); // {name: "小张", age: 22};小张
obj.sayName.call(obj2); // {name: "小张", age: 22};小张
改变了obj内部this 的指向,指向了obj2,所以打印的this.name是obj2中定义的name:小张
2、apply实现求数组最大值原理
定义一个数组
arr = [2, 4, 5, 8, 9, 4, 3, 1];
Math.max.apply(null, arr); // 9
因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组
但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项
apply会将一个数组转换为一个参数接一个参数的传递给方法
这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去
参考链接