函数值传递
在《JavaScript高级程序设计》第三版中有这么一句话 :ECMAScript中所有函数的参数都是按值传递的。
- 在js中,函数传递参数都是按值传递的
- 当在传递参数时,形参是一个局部变量,和实参互不影响。
- 当参数是一个引用数据类型时,形参复制的是实参的一份引用,所以当其改变时会影响外部实参,但并不意味着,是按引用传递的。
(1)例子1
当传入的参数是值类型的时候
var a = 3;
function fn(b){
console.log(b);
b=2;
console.log(b);
}
fn(a);
console.log(a);
因为形参是一个局部变量,故它从新开辟了一块栈内存用于存放2这个值,所以和外面的a是互不影响的。
(2)例子2
当传入的参数是引用类型,但是在函数里被赋值为了基本数据类型的时候:
var a={};
function fn(b){
console.log(b);
b=2;
console.log(b);
}
fn(a);
console.log(a);
因为刚开始传入a的时候,这里b指向的是一个指向a的堆的内存地址。
而后又将b的值赋值为了2,这时b开辟了一块栈内存,指针指向了这个栈内存
所以和外面的a是互不影响的。
(3)例子3
当传入的是一个引用类型,在函数里对引用类型做一个修改时:
var a={};
function fn(b){
console.log(b);
b.name = '小花';
console.log(b);
}
fn(a);
console.log(a);
这里b还是指向了a的堆的内存地址,所以这里修改b的属性相当于修改a的属性,故这里的a和b是会相互影响的。
|