0

本人新手, 最近在看有关javascript相关的书籍的时候遇到了这么一段代码, 不是特别理解, 有关apply绑定的, 代码如下:

const concatAll = (array) => {
    let result = []
    for (let value of array) {
        result.push.apply(result, value)
    }
    return result
}

let letters = [['a', 'b'], ['c', 'd']]
console.log(concatAll(letters)) // ['a', 'b', 'c', 'd']

简单来说concatAll这个函数就是可以将嵌套数组转换成一个数组, 我所不理解的是代码第4行, apply这个方法到底是怎样运行的, 之前学有关this的知识也是有点迷迷糊糊的, 不是特别理解, 希望能有前辈给出一个详细的解答

谢谢!

2个回答

1

已采纳

这个是apply的一个比较巧妙的用法,apply的第一个参数是this对象,第二个参数是数组集合。
这里巧妙的点在于她可以将一个数组迷人的转换成一个参数列表([paramA, paramB, paramC])转换成(paramA, paramB, paramC)。利用这个特点,可以高效使用她用于数组的合并:
Array.prototype.push

push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply转换一下这个数组。也就是你代码的实现。不知道你懂了没:)

0
在调用一个存在的函数时,你可以为其指定一个 this 对象。 this 指当前对象,也就是正在调用这个函数的对象。 使用 apply, 你可以只写一次这个方法然后在另一个对象中继承它,而不用在新对象中重复写该方法。

apply 与 call() 非常相似,不同之处在于提供参数的方式。apply 使用参数数组而不是一组参数列表(原文:a named set of parameters)。apply 可以使用数组字面量(array literal),如 fun.apply(this, ['eat', 'bananas']),或数组对象, 如 fun.apply(this, new Array('eat', 'bananas'))。

你也可以使用 arguments 对象作为 argsArray 参数。 arguments 是一个函数的局部变量。 它可以被用作被调用对象的所有未指定的参数。 这样,你在使用apply函数的时候就不需要知道被调用对象的所有参数。 你可以使用arguments来把所有的参数传递给被调用对象。 被调用对象接下来就负责处理这些参数。

撰写答案

Planets