函数的值传递和引用传递

东明兄 2018-04-08
0条评论 1,167 次浏览
东明兄 2018-04-080条评论 1,167 次浏览

//这个就是changeValue 里边没有name 所以会沿着作用域链往上找,因此修改了外部的name let name = 't1'; function changeValue(){ name = 't2'; } changeValue(); console.log(name);//t2 //函数的值传递 let name = 't1'; function changeValue(name){ name = 't2'; } changeValue(name); console.log(name);//t1

上方的执行结果是’t1’,即函数参数仅仅是被传入变量复制给了的一个局部变量,改变这个局部变量不会对外部变量产生影响。

ECMAScript中所有的函数的参数都是按值传递的。

当函数参数是引用类型时,同样的,将参数复制了一个副本到局部变量,只不过函数内的这个局部变量 也是指向外部变量的堆内存地址,在函数内对这个局部变量属性进行操作 和 在外部对这这个外部变量操作相同,但是这并不代表着引用传递.

let obj = {};
function changeValue(obj){
  obj.name = 'test';
  obj = {name:'test2'};
}
changeValue(obj);
console.log(obj.name); // test

函数参数传递的并不是变量的引用,而是变量拷贝的副本.

函数内 对 obj.name 进行赋值 会影响到外部,因为函数内的副本和外部变量 是指向同一个堆内存地址. 而 obj = {name:’test2′}; 是对函数内的的副本 obj 重新给了个堆内存地址,他和外部的obj脱离了关系,所以最终打印 test

当变量是原始类型时,这个副本就是值本身,当变量是引用类型时,这个副本是指向堆内存的地址。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注