按引用传递(call by reference)
函数所传的参数,形参不再是实参的副本,而是实参的隐式引用,此时修改形参的值,实际上就会影响到实参的值
按值传递 (call by value)
常见的函数的形参是被调用时所传实参的副本。修改形参的值并不会影响到实参
var a = 1;
function test(x){
x = 10
}
test(a);
// a 是实参, x是形参即a的副本
// 修改了x的值并不会影响到a
在JavaScript的世界里有这样一种情况,形参传递对象。
var obj = {a:1};
function test(opt){
opt.a = 10; //修改属性值
opt.c = 20; //新增属性值
opt = 100;
}
test(obj);
此时 opt 作用形参,并且传递一个对象实参,修改了形参的属性opt.a或新增了属性opt.c,则解释器会认为 opt 是隐式传参,即引用传递所以此时obj输出为 {a:10};
但是,如果将opt以基本类型(不可变)赋值opt=100那么此时解释器会认为opt是按值传递,所以opt不会影响到外部的obj对象
据说,coder们给了它一个高大上的称呼叫:按共享传递
javascript都是按值传递方式