循环中的Javascript数组突变带有回调
Javascript array mutation in looping with a callback
我使用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]
为什么会发生这种情况?this
是array
,所以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
存储引用,而v
和i
是存储值的变量。
在第一个函数中(loop(a, function(v, i) { this[i] = 0; });
)对于每个数组元素是var v = a[i]; a[i] = 0;
的等价值(因为函数中的this
是a
),因此当值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
相关文章:
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 自引用回调
- 测试Angular Service解决错误回调中的promise
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- 将json回调数据转换为日期
- 承诺在非节点式回调上使用Bluebird
- 如何在回调函数中执行流
- 回调函数中传递参数的困难(Google Map API Markers)
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- 如何使用jqueryAJAX从页面中回调多个变量
- jquery Onclick函数带有导致双击的回调排序函数
- Javascript点击事件回调不起作用
- 循环中的Javascript数组突变带有回调
- Webkit 突变观察器回调在选择框属性更改时不触发
- 突变观察器没有触发动态变化的回调
- 何时触发突变观察者回调