gpt4 book ai didi

javascript - 为什么 '_.negate' 在 underscore.js 中使用 apply with 'this' 参数?

转载 作者:行者123 更新时间:2023-11-29 19:42:10 29 4
gpt4 key购买 nike

我正在学习 underscore.js 和 javascript 编程。当我看到下划线的来源时,我无法理解其中的某些部分。

我不明白为什么它在 _.negate 中使用 apply with 'this',因为其他部分接收 'context' 并使用它们。下面是源代码。

https://github.com/jashkenas/underscore/blob/master/underscore.js

_.negate = function(predicate) {
return function() {
return !predicate.apply(this, arguments);
};
};

使用_.negate的地方在_.reject和_.omit。查看_.reject的代码,它接收'context'并将其用于上下文。

_.filter = _.select = function(obj, predicate, context) {
var results = [];
if (obj == null) return results;
if (nativeFilter && obj.filter === nativeFilter) {
return obj.filter(predicate, context);
}
each(obj, function(value, index, list) {
if (predicate.call(context, value, index, list)) results.push(value);
});
return results;
};



_.reject = function(obj, predicate, context) {
return _.filter(obj, _.negate(predicate), context);
};

请给我一些解释。提前致谢。

最佳答案

apply call 同时做两件事:

  1. 它正在设置将在predicate 中生效的this
  2. 它将匿名函数的参数列表直接传递给 predicate,而不必关心使用了多少参数。

(2) 如果你知道 arguments 应该足够清楚了在 JavaScript 中; arguments 是一个类似 Array 的对象,它保存函数的当前参数列表,JavaScript 中的所有函数都是可变的(尽管它们的定义是这样的)并且 arguments 是你如何使用当您不知道有多少个参数时。

(1) 应该通过快速浏览一下 _.negate 返回值的使用方式就很清楚了。在 _.filter 中,使用 call 调用 predicate :

predicate.call(context, value, index, list)

this 设置为 predicate 内的 context。如果 predicate 实际上是 _.negate(original_predicate) 那么实际上是这样的:

var f = function() {
return !original_predicate.apply(this, arguments);
};
f.call(context, ...)

所以 original_predicate 将像 original_predicate.apply(context, arguments) 和指定的 this (即 context) 将在 original_predicate 执行时生效。

如果 _.negate 只是这样做了:

return function(a, b, c) {
return !predicate(a, b, c);
};

然后会发生两件坏事:

  1. 指定的上下文将丢失。
  2. 只有三个论点可以通过。这对于 _.filter 就足够了,但对于 _.negate 的其他用途可能就不够了。

丢失 context 会破坏很多代码,使用 Function.prototype.apply 指定 this 恰好解决了免费的参数列表问题。

关于javascript - 为什么 '_.negate' 在 underscore.js 中使用 apply with 'this' 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22396582/

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