求值策略:按值传递 & 按引用传递

按引用传递(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都是按值传递方式

你可能感兴趣的:(求值策略:按值传递 & 按引用传递)