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

时间:2015-11-30 23:17:35

标签: 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的状态运行简单谓词或者号

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

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

我是否应该传入隐藏变量内部状态的函数而不是传递状态为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]

1 个答案:

答案 0 :(得分:2)

这可能会更好地读作

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