gpt4 book ai didi

javascript - 为什么我使用 Array.prototype.slice 时省略了 apply param thisArg?

转载 作者:行者123 更新时间:2023-11-30 11:56:29 25 4
gpt4 key购买 nike

这里是代码:

Function.prototype.curry = function() {
var slice = Array.prototype.slice,
args = slice.apply(arguments), // no thisArg ? arguments are the sec param [argsArray]
that = this;
return function() {
// thisArg: null
return that.apply(null, args.concat(slice.apply(arguments)));
}
}

以上是我的理解。那么为什么 that.apply 有一个 null 参数,而 slice.apply 没有?

当我将其更改为 args = slice.apply(null, arguments) 时,它抛出了一个错误:

Uncaught TypeError: Array.prototype.slice called on null or undefined

Function.prototype.apply() 我哪里错了?

最佳答案

.apply 为函数设置上下文和参数:

my_fn.apply({}, [1,2,3]);

function my_fn() {
console.log(this); // {}
console.log(arguments); // [1,2,3]
}

slice.apply(arguments); 是一种将类似对象的数组转换为实际数组的 hack,实际上它也可以是 .call(arguments);因为 call 几乎像 .apply 一样工作:

my_fn.call({}, 1,2,3); // <- no array but more arguments

function my_fn() {
console.log(this); // {}
console.log(arguments); // [1,2,3]
}

所以 that.apply(null, ... 只是没有为函数 that 设置上下文。而 Array.prototype.slice 期望在类似对象的数组上工作,如果没有上下文,它将失败。

关于javascript - 为什么我使用 Array.prototype.slice 时省略了 apply param thisArg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37773117/

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