call和apply方法学习笔记
一直没有搞清楚call()和apply(),今天学习了一下
call()和apply()可以将任意函数作为指定对象的方法调用!!!
-
call()-
使用一个指定的
this值和单独给出的一个或多个参数来调用一个函数。 -
使用
call()只是改变了this的指向,方法的调用者没有改变// 在这个方法里,slice内部的this指向了arguments,而slice的调用者仍然是Array Array.prototype.slice().call(arguments) -
call()方法可以不传递参数(非严格模式),在非严格模式下不传参的call()方法会指定this为全局对象,同样的还有this指定为null和undefined。严格模式下不传参和传递null或者undefined会报错 -
call()方法传递的第一个参数为指定的this,剩余的参数是要给函数传递的参数call(this,arg1,arg2,arg3,...)
-
-
apply()-
方法调用一个具有给定
this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。 -
apply()方法必须传递参数!!虽然这么说,但是在非严格模式下不传递参数或者传null和undefined会自动替换指向全局对象 -
apply()和call()基本一致,但时apply()接受的剩余参数是一个数组apply(this,[])
-
-
apply()和call()的区别:- 按照 MDN 来说,
apply的参数是必须的,而call()的参数是可选的,但实际上都可以不写。。。 apply()最多只有两个参数,接收剩余参数是一个数组或者伪数组形式;而call()的参数没有限制接收剩余参数是类似于形参的样式
- 按照 MDN 来说,
-
apply()的巧妙用法:某些方法提供了传递多个参数,但不支持传递数组时,可以使用apply()帮我们把数组中的元素依次传递到这些方法里面(与ES6中的扩展运算符类似),比如获取一个数组中的最大值:// Math.max() 不支持传入数组,只支持Math.max(num1,num2,...)这种类型的传参 // 可以利用apply()方法获得一个数组中的最大值 const arr = [1,2,400,4,5] let result = Math.max.apply(null,arr) console.log(result) // 400