使用Mutable thisarg或上下文与javascript有什么危险

我是
javascript的新手,并且想知道使用可变的thisarg来实现map,foreach和filter等功能的智慧.

考虑以下

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]

并使用相同的increaseValueFn

var arr2 = ["cat", "dog", "aardvark", "zebra"];
console.log(arr2.filter(increasingValue, {highestValue: ""}));
// outputs ["cat", "dog", "zebra"]

这些都是简单的例子.想象一下我们尝试使用非常复杂的包含规则创建更加随意的答案的情况,在这种情况下,我们可以对我们的状态进行任意更改,然后基于返回yes或no的状态运行简单谓词.

但是,我没有在网上看过任何这个例子,我发现由于这种突变,这并不适合函数式编程.

但是这样做我从根本上做错了吗?有没有更好的办法?

我应该传递一个隐藏变量中的内部状态而不是传递状态的函数吗?这将排除以下示例,它允许我们通过执行以下操作来部分评估状态:

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)));
点赞