以下代码来自参考here:
function isBigEnough(value) {
return value >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]
我想知道是否可以通过传入变量来动态更改10
行中return
的值。从参考我无法弄清楚如何做到这一点。我想调用相同的过滤器回调,但为正则表达式测试传递一个唯一值。
所以它看起来像:
function isBigEnough(value, num) {
return value >= num;
}
答案 0 :(得分:4)
试试这个
function isBigEnough(num) {
return function(value) {
return value >= num;
}
}
然后
[12, 5, 8, 130, 44].filter(isBigEnough(10));
这是如何运作的?
isBigEnough(10)
会返回匿名函数答案 1 :(得分:4)
最简单的方法是使用匿名函数并关闭要使用的变量:
var minSize = 10;
var filtered = [12, 5, 8, 130, 44].filter( val => val >= minSize );
如果你真的想保留一个命名函数来回调,你可以用bind部分地应用一个参数:
function isBigEnough(minSize, value) {
return value >= minSize;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough.bind(null,10));
这里,bind将返回一个新函数,最左边的参数绑定到10(第一个参数,一个为null,是被调用时作为this
传递给函数的函数)。因此,过滤器传入的参数将显示为回调中的第二个值。
答案 2 :(得分:2)
这应该有效。第二个参数(在这种情况下为10
)将作为this
传递。
function isBigEnough(value) {
return value >= this;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough, 10);
答案 3 :(得分:0)
这个(更通用的)方法怎么样:
//argument order is chosen to be consistent through all functions, and readability when used:
var op = { //for operator
eq: b => a => a === b, //equal
neq: b => a => a !== b, //not equal,
gt: b => a => a > b, //greater than
lt: b => a => a < b, //lower than
gteq: b => a => a >= b,
lteq: b => a => a <= b,
//bonus, negating a function:
not: fn => (...args) => !fn(...args) //to be used as `arr.filter( op.not(filterFn) )`
}
这些快捷方式对于这些操作符来说很常见,除此之外我认为生成的代码非常易读且可以自我解释
var filtered = [12, 5, 8, 130, 44].filter( op.gteq(10) );
//or:
//defining how to validate thew values
var isBigEnough = op.gteq(10);
//...
//the rest of the code only utilizes this function -> only 1 place to change
var filtered = [12, 5, 8, 130, 44].filter( isBigEnough );