Передача параметров по значению и по ссылке
Передача параметров по значению
Строки, числа, логические значения передаются в функцию по значению. Иными словами при передаче значения в функцию, эта функция получает копию данного значения. Рассмотрим, что это значит в практическом плане:
function change(x){
x = 2 * x;
console.log("x in change:", x);
}
var n = 10;
// n before change: 10
console.log("n before change:", n);
// x in change: 20
change(n);
// n after change: 10
console.log("n after change:", n);
Функция change
получает некоторое число и увеличивает его в два раза. При вызове функции change
ей передается число n
. Однако после вызова функции мы видим, что число n
не изменилось, хотя в самой функции произошло увеличение значения параметра. Потому что при вызове функция change
получает копию значения переменной n
. И любые изменения с этой копией никак не затрагивают саму переменную n
.
Передача по ссылке
Объекты и массивы передаются по ссылке. То есть функция получает сам объект или массив, а не их копию:
function change(user){
user.name = "Tom";
}
var bob ={
name: "Bob"
};
// Bob
console.log("before change:", bob.name);
change(bob);
// Tom
console.log("after change:", bob.name);
В данном случае функция change
получает объект и меняет его свойство name
. В итоге мы увидим, что после вызова функции изменился оригинальный объект bob
, который передавался в функцию.
Однако если мы попробуем переустановить объект или массив полностью, оригинальное значение не изменится:
function change(user){
// полная переустановка объекта
user= {
name:"Tom"
};
}
var bob ={
name: "Bob"
};
// Bob
console.log("before change:", bob.name);
change(bob);
// Bob
console.log("after change:", bob.name);
То же самое касается массивов:
function change(array){
array[0] = 8;
}
function changeFull(array){
array = [9, 8, 7];
}
var numbers = [1, 2, 3];
// [1, 2, 3]
console.log("before change:", numbers);
change(numbers);
// [8, 2, 3]
console.log("after change:", numbers);
changeFull(numbers);
// [8, 2, 3]
console.log("after changeFull:", numbers);