apply (..) 与 call (..)
apply()
与call()
的区别是:
apply()
方法接收的是一个参数数组call()
方法接收的是参数列表
apply (..)
apply()
方法调用一个具有给定 this 值的函数,以及作为一个数组(或类似数组对象)提供的参数
语法
func.apply(thisArg, [argsArray]);
参数
-
thisArg
可选参数。在
func
函数运行时使用的this
值。 -
argsArray
可选参数。一个数组或类数组对象,其中的数组元素将作为单独的参数传给
func
函数。如果参数值为
null
或undefined
,则表示不需要传入任何参数
返回值
调用有指定 this
值和参数的函数结果
call (..)
call(..)
方法用法和 apply(..)
一致,只是传入的参数不同:
语法
func.call(thisArg, argument1, argument2, ...);
参数
thisArg
,this值argument1 ~ n
参数列表
[ ] .slice .call ( arguments, 1 )
/**
* test something~
* @param fn {function} 回调函数
**/
function test(fn) {
let args = [].slice.call(arguments, 1);
args.push(233); // [fn, 233]
}
分拆代码:
[]
,空数组[].slice
,相等于Array.prototype.slice()
,即 Array 的原型链,而 slice 是原型链中的方法call(arguments, 1)
,将 test 函数传入的 fn 函数赋给 args 数组的 slice ,再由 slice 转换成数组
关于 slice 方法
slice 不修改原数组,只会返回一个潜伏之了原数组中的元素的一个新数组