先套用js高程一句话——ECMAScript 中所有函数的参数都是按值传递
什么叫做按值传递???
可以简单理解为生成一个新的变量和需要传递的参数的值一样,就像把值从一个变量复制到另一个变量一样。
var a = 1;
function num(o){
o = 2;
return o;
}
obj(a);
console.log(a);//1
看上面的代码把a(值为1)当做变量运行函数num,函数内更改变量的值为2,但其实更改的不是a,而是按值传递生成的新的变量,所以a并不会产生改变。
那么再看当一个对象传递进去的情况呢??
var a = {b:1};
function obj(o){
o.b = 2;
return o;
}
obj(a);
console.log(a);//{b:2}
WTF!!!!!!!!! 为什么它变了,不应该按值传递本身不发生改变吗????/
这里我们就需要理解对象在js中的引用与赋值了,我们一开始定义a={b:1},这里把他拆分为两部分可以,首先创建一个对象{b:1}并保存在内存堆里面,然后我们可以知道对象{b:1}在内存中的地址(假设为000000),那么我就把这个地址000000给a。这样a就指向这个对象{b:1}咯。
理解了对象的引用方式再来看上面的代码,再来理解此处的按值传递。这里并不是生成一个新的{b:1}当做参数,而是生成一个新的引用地址(假设111111),它和原先的引用地址(000000)同时指向这个对象。所以不管在哪里更改这个对象的属性,最终都导致最终的结果变了 为{b:2}