2013-12-14 2 views
0

я реализую обхват с обратным вызовом с использованием call() функции (примером из http://ejohn.org/apps/learn/#28 см ниже)Javascript мутации массива в перекручивании с обратным вызовом

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 - это то же самое. Однако в одном случае массив модифицируется, а в другом он остается неизменным.

+0

Поскольку переназначение переменной в javascript не будет обновлять то, что указала эта переменная – megawac

ответ

2

Когда fn.call(array, array[i], i); вызывается затем в fn():

  • this сохраняет ссылку на array;
  • v - это переменная, хранящая значение array[i] (и в начале области действия можно считать var v = array[i];); и
  • i - это переменная, сохраняющая значение текущего индекса массива.

Обратите внимание, что 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 в пределах области функции и не массив.

0

Поскольку переназначение переменной в 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 
Смежные вопросы