函数的值传递和引用传递
//这个就是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
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论