gpt4 book ai didi

javascript - 递归Function.prototype.apply概念理解

转载 作者:行者123 更新时间:2023-12-02 14:49:33 27 4
gpt4 key购买 nike

我遇到了this stackoverflow question关于递归压平 JS 数组。这是接受的答案:

function flatten() {
var flat = [];
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] instanceof Array) {
flat.push.apply(flat, flatten.apply(this, arguments[i]));
} else {
flat.push(arguments[i]);
}
}
return flat;
}

flatten([[1], 2, [3, 4]]); // returns [1, 2, 3, 4]

我无法理解 flat.push.apply(...)flatten.apply(...) 的工作原理。

据我所知,只有当数组中的项目本身都不是数组时,该函数才会退出。我还了解 Function.prototype.apply() 允许您使用参数数组调用函数。

我不明白的是,如果flat将设置为[],那么为什么要使用flat.push...每个函数迭代。另外,将 flat 设置为 this 上下文有什么意义?

有人可以帮忙解释一下 flat.push.apply(flat, flatten.apply(this,arguments[i])); 的执行原理吗?

最佳答案

他安全地使用了flat.push,因为push实际上每次都是在不同的数组上调用的。每次执行flatten时,它都会创建新数组,并在flat变量中存储不同的引用,因此每次递归都与不同的flat数组相关联。 p>

flat设置为this上下文提供了要调用push的数组。尝试将其设置为 null,您可能会收到 TypeError,因为非法操作 - 试图在 null 上调用 push >。

现在是更复杂的部分。 push 接受要添加到数组中的参数列表,对吗?但有时一一提供这些参数并不方便,特别是,如果您不知道,push 应该接收多少个参数,就像您的情况一样,其中数组的大小是压平变化。

这就是该代码的作者通过 apply 调用 push 的原因,并使用数组引用作为第二个参数 - 这是 flatten.apply(this, argument[i]) - 对当时仅包含数字的数组的引用。该数组的每个数字都被推送到 flat,因为 apply 调用 push 并通过参数将该数组的整个数字列表传递给 推。



由于类似的原因,flatten.apply(this,arguments[i]) 部分通过 apply 调用 - 它利用 arguments (每个函数都有类似数组的对象)来轻松处理函数参数。在 apply 的第一个参数中移交 this 在这里并不重要,因为 thisflatten< 中没有用处 (this 指向代码示例中的全局对象)。








关于javascript - 递归Function.prototype.apply概念理解,我们在Stack Overflow上找到一个类似的问题:

https://stackoverflow.com/questions/36293100/




27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com