这apply干了啥?

 let values = [1, 2, 3, 4];
  function getSum() {
    let sum = 0;
    for (let i = 0; i < arguments.length; ++i) {
      sum += arguments[i];
    }
    return sum;
  }
  console.log(getSum(values)); //01,2,3,4
  console.log(getSum.apply(null, values));//10
阅读 3k
4 个回答
let values = [1, 2, 3, 4];
function getSum() {
  let sum = 0;
  for (let i = 0; i < arguments.length; ++i) {
    sum += arguments[i];
  }
  return sum;
}

// apply() 方法调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。
// 在下面的调用中, this 为 null,数组形式的参数为 values
// 最终相当于 getSum(1, 2, 3, 4)
// getSum 的 arguments 为 [1, 2, 3, 4]
// 按你的程序,执行正常
console.log(getSum.apply(null, values)); //10

// getSum 的 arguments 为 [values] 即,[[1, 2, 3, 4]]
// arguments 的 length 为 1
// sum 初始值为数字 0
// for 循环只能循环一次, 0 + [1, 2, 3, 4]
// + 运算符在操作数字是,是数学计算,操作字符串时,是将两个字符串相连,由于上面两个被操作的参数,第二个是一个数组,不是数字,所以不会进行数学运算
// 字符串 + 字符串,JavaScript 会临时把这两个字符串都转换为 String 实例,所以上面的计算为:
// String(0) + String([1, 2, 3, 4])
// 也就是
// '0' + '1, 2, 3, 4'
// 得到结果: 01, 2, 3, 4
console.log(getSum(values)); //01,2,3,4

如果你想直接使用 getSum 调用,不使用 apply,可以像下面这样调用:

getSum(...values)

这里的主要目的就是改变参数结构,但是直接用 扩展运算符 更直接 ...

文档中apply的第二个参数要求传入的是数组(或类数组对象)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题