我正在学习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) ;
你能给我一些提示,以便我能理解代码吗?谢谢!
答案 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]);
}