我是 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]
并使用相同的 increasingValueFn
var arr2 = ["cat", "dog", "aardvark", "zebra"];
console.log(arr2.filter(increasingValue, {highestValue: ""}));
// outputs ["cat", "dog", "zebra"]
这些都是简单的例子。想象这样一种情况,我们试图用非常复杂的包含规则创建一个更加任意的答案,在这种情况下,我们可以对我们的状态进行任意更改,然后运行一个基于返回是或否的状态的简单谓词。
但是,我没有在网上看到任何这样的例子,我意识到由于突变,这不太适合函数式编程。
但是我这样做从根本上是错误的吗?有没有更好的办法?
我是否应该传递一个隐藏变量内部状态的函数,而不是将状态作为 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)));
关于javascript - 在 javascript 中使用可变 thisarg 或上下文有什么危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34009812/