Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中使用可变thisarg或context有什么危险_Javascript - Fatal编程技术网

在javascript中使用可变thisarg或context有什么危险

在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

我是javascript新手,我想知道在map、foreach和filter等函数中使用可变thisarg是否明智

考虑以下几点

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