call 和 apply 非常相似, 相同点:
- call 和 apply 都是对函数对象的调用
- call 和 apply 第一个参数都是指定 this
他们的不同点是, call 的后续参数是展开的, apply 的后续参数是一个包含了所有参数的参数列表
以下三种完全等价:
console.log(Math.max(1, 2, 3))
console.log(Math.max.call(null, 1, 2, 3))
console.log(Math.max.apply(null, [1, 2, 3]))
而你的代码中第一个
let a = [1, 2, 3, 4, 5, 6].shift.call([2, 4])
应该是没有理解的情况下的误用:
- 首先
Array
的 shift
方法没有参数
- 上述代码实际上是执行了这个:
[2, 4].shift() // 返回 2
原因是你替换了 shift 这个函数执行目标的 this 对象, 所以实际上已经在另一个数组上执行了 shift()
方法
建议细读文档
Array.prototype.shift
Function.prototype.call
Function.prototype.apply
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…