在javascript中使用可变thisarg或context有什么危险
我是javascript新手,我想知道在map、foreach和filter等函数中使用可变thisarg是否明智 考虑以下几点在javascript中使用可变thisarg或context有什么危险,javascript,Javascript,我是javascript新手,我想知道在map、foreach和filter等函数中使用可变thisarg是否明智 考虑以下几点 function increasingValueFn(i) { if (this.highestValue < i) { this.highestValue = i; return true; } return false; } 并使用相同的递增值fn var arr2 = ["cat", "do
function increasingValueFn(i)
{
if (this.highestValue < i)
{
this.highestValue = i;
return true;
}
return false;
}
并使用相同的递增值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)));
var increasingFrom=函数(init){
var highestValue=init;
返回函数(一){
if(最高值
我不确定我是否理解问题所在。这在某种程度上是一个品味问题(可能还有其他问题,取决于您的设计细节),但由于您实际上不需要使用thisArg,因此最好避免使用它。它是用来处理Javascript处理“this”(其中一些在ES6的箭头符号中被修复)的缺点的。在您的示例中,没有任何东西可以阻止您使用捕获的变量,而且它更容易理解。@pvg不使用自由变量是有原因的:如果没有显式重置,您将无法再次使用该函数。隐藏状态是不好的。@zerkms从需要什么样的重用的问题上看,这并不完全清楚,通常有非常好的解决方法。这种方法的问题(我知道这并不少见)是它劫持了一种机制,目的是为了其他目的,以获得可疑的好处和降低清晰度。这可以说是明智的,但并不能真正回答为什么。因此,在这种实现中,任何可以作为thisarg传递的东西,可以改为传递给init,并且状态可以以完全相同的方式进行排列。如果要重置状态,需要再次调用increasingFrom(newInit)值。此样式也消除了“This.”。此样式意味着您在调用它时不需要记住increasingValue
的实现(即,要放入初始状态的属性的名称)
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)));