gpt4 book ai didi

javascript - this.apply 方法与 this

转载 作者:行者123 更新时间:2023-12-02 15:14:54 25 4
gpt4 key购买 nike

来自

Douglas Crockford javascript the good parts

推送的实现

Array.method('push', function () {
this.splice.apply(
this,
[this.lenght, 0].concat(Array.prototype.slice.apply(arquments));
return this.length;
});

让我们通过以下示例进行分析:我有 10 个元素的数组,想要添加下一个值为 11 的元素。

Array.method('push', function () {
this.splice.apply(
this,
[10, 0].concat([11]);
return this.length;
});

这给了我

Array.method('push', function () {
this.splice.apply(this,[10, 0, 11]);
return this.length;
});

所以我知道这会这样做:MyInitialArray.splice(10,0,11) 只会在 10 位置找到元素,删除任何内容并在其旁边添加值为 11 的元素?

所以我的主要问题是,为什么必须有双倍的构造

如:this.splice.apply(this, ... ??

这里提出了类似的问题,但我关于 double this.splice.apply(this

的问题没有答案

this.apply method with this as parameter

其他的话:

如果我调用this.splicesplice将在this准备就绪的情况下执行,那么为什么需要传递相同的应用

最佳答案

So my main question, why there has to be construction with double this

从根本上来说,因为它想要调用 splice 以数组形式提供参数,而不是离散参数。

splice 需要离散参数,例如:

array.splice(1, 0, 'a', 'b', 'c');

...这意味着“在索引 1 处,删除 0 个条目,然后添加条目‘a’、‘b’和‘c’。”

但是该代码想要使用数组 [10, 0, 11] 调用 splice 就像我们已经这样做了:

this.splice(10, 0, 11);

我们不能只做

this.splice([10, 0, 11]); // <== Doesn't work

...因为这只是为第一个参数传递一个数组,而 splice 无法理解。

要将数组分散为离散参数,在 ES5 及更早版本中,我们必须使用 Function#apply:它调用您调用的函数,接受参数将其作为数组提供,并使用这些数组条目作为离散参数调用该函数。

为了使用Function#apply,我们需要一个值作为其第一个参数,这就是调用期间的this。这就是第二个 this 出现的原因。

第一个 this (例如,this.splice)就在那里,所以我们得到了 splice 函数。该行也可以是:

Array.prototype.slice.apply(this, [10, 0, 11]);
// or (can't say I like this one):
[].slice.apply(this, [10, 0, 11]);

回复您的评论:

If I call this.splice, splice will execute with this allready, so why there is need to pass the same this with apply ?

该代码不是直接调用 this.splice,而是调用 this.splice.applyapply 的第一个参数是调用原始函数 (this.splice) 时用作 this 的内容。

<小时/>

在 ES2015 (ES6) 中,这将使用扩展运算符来完成:

this.splice(...[10, 0, 11]);

扩展运算符将数组的条目扩展为离散参数。

关于javascript - this.apply 方法与 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34546175/

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