首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“_.negate”在underscore.js中使用“this”参数?

为什么“_.negate”在underscore.js中使用“this”参数?
EN

Stack Overflow用户
提问于 2014-03-14 05:05:49
回答 1查看 962关注 0票数 2

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

我不明白为什么在_.negate中使用apply with 'this‘,因为其他部分接收并使用它们。

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

代码语言:javascript
复制
_.negate = function(predicate) {
    return function() {
        return !predicate.apply(this, arguments);
    };
};

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

代码语言:javascript
复制
_.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);
};

请给我解释一下。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-03-14 23:10:52

apply调用同时做两件事:

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

(2)如果您了解JavaScript中的arguments,那么应该足够清楚;arguments是一个类似数组的对象,它包含函数的当前参数列表,JavaScript中的所有函数都是可变的(不管它们的定义是什么),而当您不知道有多少参数时,arguments是如何处理参数的。

(1)(1)应该清楚地了解如何使用_.negate返回值。在_.filter内部,使用call调用predicate

代码语言:javascript
复制
predicate.call(context, value, index, list)

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

代码语言:javascript
复制
var f = function() {
    return !original_predicate.apply(this, arguments);
};
f.call(context, ...)

因此,original_predicate将像original_predicate.apply(context, arguments)一样被调用,指定的this (即context)将在original_predicate执行时生效。

如果_.negate就这么做了:

代码语言:javascript
复制
return function(a, b, c) {
    return !predicate(a, b, c);
};

然后就会发生两件坏事:

  1. 指定的context将丢失。
  2. 只有三个论点才能通过。对于_.filter来说,这是足够的,但对于_.negate的其他用途来说,这是不够的。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22396582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档