循环中的Javascript数组突变带有回调

Javascript array mutation in looping with a callback

本文关键字:回调 突变 数组 Javascript 循环      更新时间:2023-09-26

我使用call()函数通过回调实现循环(例如http://ejohn.org/apps/learn/#28,见下文)

function loop(array, fn){ 
  for ( var i = 0; i < array.length; i++ ) 
    fn.call( array, array[i], i ); 
}

要修改数组的内容,我可以使用

var a = [0,1,2]
loop(a, function(v, i) { this[i] = 0; }); // a = [0,0,0]

但不是

var a = [0,1,2]
loop(a, function(v, i) { v = 0; }); // a = [0,1,2]

为什么会发生这种情况?thisarray,所以this[i]array[i]以及v是相同的。然而,在一种情况下,数组被修改,在另一种情况中,它保持不变。

调用fn.call( array, array[i], i );时,在fn():内

  • CCD_ 9存储对CCD_
  • v是存储array[i]的值的变量(并且可以被认为是在函数的作用域开始时执行var v = array[i];);以及
  • CCD_ 14是存储阵列的当前索引的值的变量

注意,this存储引用,而vi是存储值的变量。

在第一个函数中(loop(a, function(v, i) { this[i] = 0; });)对于每个数组元素是var v = a[i]; a[i] = 0;的等价值(因为函数中的thisa),因此当值0被分配给数组的给定索引时,数组被更新。

然而,在第二个函数(loop(a, function(v, i) { v = 0; });)中,对于每个数组元素,var v = a[i]; v = 0;是等效的,因此数组不会更新,因为值"0"被分配给函数范围内的变量v,而不是数组。

因为在javascript中重新分配变量不会更新该变量所引用的内容。在第一个代码段中,将数组的索引i重新分配为新值0。在第二个代码段中,您只是将v重新分配为0,这不会修改数组。

本质上,你所做的只是

var a = [1,2,3];
//first case
var v = a[1];
a[1] = 0;
//Array value of index 1 is updated
//second case
var v = a[1];
v = 2;
//array value of index 1 is not updated