apply与call

apply (..) 与 call (..)

apply()call() 的区别是:

  • apply() 方法接收的是一个参数数组
  • call() 方法接收的是参数列表

apply (..)

apply() 方法调用一个具有给定 this 值的函数,以及作为一个数组(或类似数组对象)提供的参数

语法

func.apply(thisArg, [argsArray]);

参数

  • thisArg

    可选参数。在 func 函数运行时使用的 this 值。

  • argsArray

    可选参数。一个数组或类数组对象,其中的数组元素将作为单独的参数传给 func 函数。

    如果参数值为 nullundefined ,则表示不需要传入任何参数

返回值

调用有指定 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]
}

分拆代码:

  1. [] ,空数组
  2. [].slice ,相等于 Array.prototype.slice() ,即 Array 的原型链,而 slice 是原型链中的方法
  3. call(arguments, 1) ,将 test 函数传入的 fn 函数赋给 args 数组的 slice ,再由 slice 转换成数组

关于 slice 方法

slice 不修改原数组,只会返回一个潜伏之了原数组中的元素的一个新数组

  • 如果该元素是个对象引用 (不是实际的对象),slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。
  • 对于字符串、数字及布尔值来说(不是 StringNumber 或者 Boolean 对象),slice 会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。
原文地址:https://www.cnblogs.com/CreateBox/p/15194648.html