函数的值传递和引用传递

chat

//这个就是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

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

版权声明:
作者:东明兄
链接:https://blog.crazyming.com/note/1265/
来源:CrazyMing
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
函数的值传递和引用传递
函数会将将参数复制一个副本到局部变量,当变量是原始类型时,这个副本就是值本身,当变量是引用类型时,这个副本是指向堆内存的地址。
<<上一篇
下一篇>>
chat