我是javascript的新手,想知道在map、foreach和filter等函数中使用可变thisarg是否明智。
考虑以下
function increasingValueFn(i)
{
if (this.highestValue < i)
{
this.highestValue = i;
return true;
}
return false;
}
该函数将允许我们以thisarg的形式传入对象,如以下示例所示。
var arr = [1, 2, 3, 2, 1, 5, 6, 7];
console.log(arr.filter(increasingValueFn, {highestValue: 0}));
// outputs [1, 2, 3, 5, 6, 7]
并使用相同的递增值Fn
var arr2 = ["cat", "dog", "aardvark", "zebra"];
console.log(arr2.filter(increasingValue, {highestValue: ""}));
// outputs ["cat", "dog", "zebra"]
这些都是简单的例子。想象一下,我们试图创建一个更随意的答案,其中包含非常复杂的规则,在这种情况下,我们可以任意更改我们的状态,然后基于该状态运行一个简单的谓词,返回yes或no。
然而,我在网上没有看到任何这样的例子,我意识到由于突变,这不太适合函数式编程。
但我这样做从根本上说是错的吗?有更好的方法吗?
我应该传入一个在变量中隐藏内部状态的函数,而不是将状态作为thisarg传入吗?这将排除以下示例,该示例允许我们通过执行以下操作来部分评估状态:
var arr = [1, 2, 3, 2, 1, 5, 6, 7];
var arr1 = [3, 7, 9, 4, 2, 12];
var context = {highestValue: 0};
console.log(arr.filter(increasingValue, context));
// outputs [1, 2, 3, 5, 6, 7]
// now using the **same** context, continue with arr1
console.log(arr1.filter(increasingValue, context));
// outputs [9, 12]
这可能读起来更像
var increasingFrom = function(init) {
var highestValue = init;
return function(i) {
if (highestValue < i) {
highestValue = i;
return true;
}
return false;
};
}
console.log(arr.filter(increasingFrom(0)));