将可变thisarg或上下文与javascript一起使用有什么危险



我是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)));

最新更新