Underscore.js _.each函数的第三个参数如何工作?

时间:2014-08-30 07:33:36

标签: javascript node.js underscore.js

我正在学习Underscore.JS,学习复数课程,但我坚持了一些观点。任何帮助将不胜感激:

    var _ = require('underscore');
    var values = [{
            name: "Craig",
            state: "CA",
            price: 1
        }, {
            name: "John",
            state: "FL",
            price: 2
        }, {
            name: "Dan",
            state: "AZ",
            price: 8.5
        }, {
            name: "Elijah",
            state: "TN",
            price: 2.75
        }],

        evenCriteria = function(value) {
            return value.price % 2 === 0;
        },

        oddCriteria = function(value) {
            return value.price % 2 !== 0;
        },

        greaterThanEightCriteria = function(value) {
            return value.price > 8;
        },

        lessThanFiveCriteria = function(value) {
            return value.price < 5;
        };

    console.log('Even prices:');
    _.each(_.filter(values, evenCriteria), LogProperty, 'price');

    console.log('Odd prices:');
    _.each(_.filter(values, oddCriteria), LogProperty, 'price');

    console.log('Prices > 8:');
    _.each(_.filter(values, greaterThanEightCriteria), LogProperty, 'price');

    console.log('Prices < 5:');
    _.each(_.filter(values, lessThanFiveCriteria), LogProperty, 'price');

因为我找不到函数LogProperty所以我自己编写:

        LogProperty = function (e, i, l) {
            console.log(e.price);
        }

但是根据我写的上述函数,第三个参数无关紧要:

    _.each(_.filter(values, lessThanFiveCriteria), LogProperty, 'price');

打印出相同的值:

    _.each(_.filter(values, lessThanFiveCriteria), LogProperty);

你能给我一些提示,为什么会这样?如果我按如下所示编写LogProperty,则返回对象:

        LogProperty = function (e, i, l) {
            console.log(e);
        }

要获得结果,我们需要将第三个参数'price'传递给此函数。但是从上面的代码来看,'price'在LogProperty函数之外。从http://underscorejs.org/#each开始,我知道它有3个参数:

    _.each(list, iteratee, [context]) 

在上面的例子中,'price'是上下文吗?我不这么认为,因为它没有效果。

我认为LogProperty函数应该以另一种方式编写,它将_.each函数中的第三个参数传入,通过这种方式,我不必完全编写console.log(e.price) ;

你能给我一些提示,以便我能理解代码吗?谢谢!

1 个答案:

答案 0 :(得分:4)

第三个参数是[context]。也就是说,它定义了函数内的this值。

所以,如果你这样做了:

LogProperty = function(e, i, l) {
  console.log(this);
}

// this will be 'price'.
_.each(list, LogProperty, 'price');

你会得到log&#39; price&#39;。

您还可以使用this

为任何功能设置bind
_.each(list, LogProperty.bind('price'));

与上述用法相同。

因此,在您的情况下,您可以通过以下方式解决问题:

LogProperty = function(e, i, l) {
  console.log(e[this]);
}