Javascript 除了作用域之外,为forEach()提供对数组本身的引用还有其他原因吗?

Javascript 除了作用域之外,为forEach()提供对数组本身的引用还有其他原因吗?,javascript,arrays,foreach,Javascript,Arrays,Foreach,根据,提供给forEach函数的回调被赋予3个参数:currentValue,index,数组 我试图理解forEach回调作为第三个参数提供给数组本身的引用的目的,我能理解的唯一原因是作用域 第一个例子: 函数printLastName(值、索引、数组){ 如果(索引==(array.length-1)){ console.log(值); } } 函数setupNames(){ 常量名称=['A','B','C']; name.forEach(printLastName); } setupNa

根据,提供给
forEach
函数的回调被赋予3个参数:
currentValue
index
数组

我试图理解
forEach
回调作为第三个参数提供给
数组本身的引用的目的,我能理解的唯一原因是作用域

第一个例子:

函数printLastName(值、索引、数组){
如果(索引==(array.length-1)){
console.log(值);
}
}
函数setupNames(){
常量名称=['A','B','C'];
name.forEach(printLastName);
}
setupNames();
我想在上面的第一个示例中说明的是,用作
forEach()
回调的
printLastName()
没有对原始
names
数组的引用,因此,如果需要使用数组,则需要为其提供
3rd参数,因此,我明白为什么为
forEach
回调提供对原始
数组的引用的唯一原因

第二个例子:

函数setupNames(){
常量名称=['A','B','C'];
name.forEach((值、索引、数组)=>{
如果(索引==(names.length-1)){
console.log(值);
}
});
}
setupNames();
在第二个示例中,行
(index==(names.length-1))
,我可以使用
名称
数组
,因为我可以使用它。据我所知,使用任何一种都没有区别

总而言之,我的问题是:

  • forEach
    方法的
    回调
    仅由于作用域问题(第一个示例)而不是任何其他原因,将
    数组
    作为
    第三个参数提供,对吗
  • 在第二个示例中,我在对
    forEach
    的lambda回调中使用
    名称
    数组
    绝对没有区别,无论
    lambda回调逻辑是什么,对吗
    我最近遇到了这个用例,这让我明白了为什么数组参数是有用的(而我以前也没有看到它的有用性)

    考虑:

    const names = ['John', 'Paul', 'John Paul', 'John Smith', 'James'];
    
    names.filter(n => n.startsWith('John')).forEach((john, index, array) => {
       // If it's not the first or last entry, then we want to write it to console
       if (index !== 0 || index !== array.length - 1) console.log(john);
    });
    

    如果您正在创建一个新集合作为
    .filter
    等的结果,那么如果按照上述方式编写,则新集合将无法作为参考。通过数组参数,您可以访问正在使用
    进行迭代的集合。forEach

    所有功能都来自规范和方案,因此进入

    它似乎没有一个非常具体的存在理由。但正如您所说,在分析可能使用
    forEach
    的不同示例时,有理由认为这是由于作用域。例如,定义通用函数时,如:

    函数计算需要在数组中查找的方法(val、index、array
    。如果我们只依赖上下文,而只引用使用此函数的数组,则在实现中会更加紧凑

    const array1 = [1 , 2, 3, 4, 5]
    const array2 = [1, 2]
    
    array1.forEach((val) => {
     something(val / array1[0]))
    array2.forEach((val) => {
     something(val, array2[0]))
    
    vs


    还请记住,除了回调之外,我们还可以将任何上下文传递给forEach,称为
    thisArgument
    ,这突出了将数组保持在当前使用数组的范围或目标的重要性。

    第一个示例是一个充分的用例,可以解释为什么有人认为添加它很有用。因此,它都是“解释”的和“固执己见”(因为此功能不是一项要求或在所有类似API中都不可用)。确切地说,这个问题不是固执己见的;但是,API可以肯定是这样的,以合理化这些,而不是“它是如何定义的”,不考虑这些是否足以反映这些。1)这是一个API决定;2) 在所示代码中,它们在语义上是相同的:两个名称(闭包中捕获的变量和参数)都引用/计算同一个数组对象。“使用
    名称
    数组
    ,无论lambda回调逻辑是什么,都没有区别”,除非逻辑覆盖了这些变量中的一个,但没有覆盖另一个:-)@Bergi如果您操作
    名称
    数组
    ,则另一个变量也会受到影响,因此它是相同的,是吗?很难找到实用的例子来说明什么时候你需要引用原始数组,而不是像我想的那样与缩减/折叠类操作无关:D“大多数新功能”-
    forEach
    完全不是一个新功能。对不起,我引用了所有功能:,在本例中,
    forEach
    3rd param变量
    array
    names
    变量不等效。然而,我之所以将此标记为正确,是因为它举例说明了为什么
    forEach
    回调方法定义包含第三个参数(除了作用域),这是我首先提出此问题的根本原因。谢谢
    const array1 = [1 , 2, 3, 4, 5]
    const array2 = [1, 2]
    
    const operationCallback = (val, i, array) => {
     something(val /array[0])
    } 
    
    array1.forEach(operationCallback)
    array2.forEach(operationCallback)