gpt4 book ai didi

Javascript 数组在回调循环中发生变化

转载 作者:行者123 更新时间:2023-12-02 18:00:37 25 4
gpt4 key购买 nike

我使用 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() 内调用 fn.call( array, array[i], i ); 时:

  • this 存储对array 的引用;
  • v 是一个存储 array[i] 值的变量(可以认为是 var v = array[i]; 位于函数作用域的开头);和
  • i 是一个变量,存储数组当前索引的值。

请注意,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 数组在回调循环中发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20578816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com