函数值传递问题

函数值传递

在《JavaScript高级程序设计》第三版中有这么一句话 :ECMAScript中所有函数的参数都是按值传递的

  • 在js中,函数传递参数都是按值传递的
  • 当在传递参数时,形参是一个局部变量,和实参互不影响。
  • 当参数是一个引用数据类型时,形参复制的是实参的一份引用,所以当其改变时会影响外部实参,但并不意味着,是按引用传递的

(1)例子1

当传入的参数是值类型的时候

var a = 3;
function fn(b){
    console.log(b); //3
    b=2;
    console.log(b);  //2
}
fn(a);
console.log(a);   //3

因为形参是一个局部变量,故它从新开辟了一块栈内存用于存放2这个值,所以和外面的a是互不影响的。

(2)例子2

当传入的参数是引用类型,但是在函数里被赋值为了基本数据类型的时候:

var a={};
function fn(b){
    console.log(b);  //{}
    b=2;
    console.log(b);  //2
}
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);  //{name:'小花'}
}
fn(a);
console.log(a);   //{name:'小花'}

这里b还是指向了a的堆的内存地址,所以这里修改b的属性相当于修改a的属性,故这里的a和b是会相互影响的。

你可能感兴趣的:(前端,javascript,前端)