我正在学习underscore.js和javascript编程。当我看到下划线的来源时,我无法理解其中的某些部分。
我不明白为什么在_.negate中使用apply with 'this‘,因为其他部分接收并使用它们。
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);
};请给我解释一下。提前谢谢。
发布于 2014-03-14 23:10:52
apply调用同时做两件事:
this中生效的predicate。predicate,而不必关心使用了多少参数。(2)如果您了解JavaScript中的arguments,那么应该足够清楚;arguments是一个类似数组的对象,它包含函数的当前参数列表,JavaScript中的所有函数都是可变的(不管它们的定义是什么),而当您不知道有多少参数时,arguments是如何处理参数的。
(1)(1)应该清楚地了解如何使用_.negate返回值。在_.filter内部,使用call调用predicate
predicate.call(context, value, index, list)这将this设置为context to predicate。如果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);
};然后就会发生两件坏事:
context将丢失。_.filter来说,这是足够的,但对于_.negate的其他用途来说,这是不够的。丢失context会破坏很多代码,使用Function.prototype.apply指定this恰好可以免费解决参数列表问题。
https://stackoverflow.com/questions/22396582
复制相似问题