说明(2017-4-2 18:27:11):
1. 作为函数的参数,就是将函数的数据拷贝一份,传递给函数的定义中的参数。
函数foo()在调用的时候,做了两件事:
(1)函数在调用的时候,首先需要将参数中的数据拷贝一份,即数字123拷贝一份。
(2)跳转到函数的定义中(函数体),在此之前完成了函数的赋值,即num=123。
(3)正式的进入函数内,准备执行函数的每一句话。
1 function foo(num){} 2 var a = 123; 3 foo(a);
2. 值类型作为函数参数传递的特征,函数内与函数外是两个不同的变量,仅仅是值相等而已。
3. 引用类型作为函数参数传递的特征,函数内与函数外是两个不同的变量,但是指向同一个对象。
*因此在函数内部允许修改函数外部的对象的数据。
例1:因为没有先定义p1,所以不存在p1这个对象。报错:不能设置“未定义”的name属性。
1 <script type="text/javascript"> 2 var o = {name: "张三", age: 19, gender: "男"}; 3 // copy拷贝的第二种方法,带参数(第一种方法是return返回值) 4 o.copy = function(obj){ 5 for(var k in this){ 6 obj[k] = this[k]; 7 } 8 }; 9 var p1; 10 o.copy(p1); 11 </script>
例2:copy函数里,设置了obj = {}。不报错,但watch里面先是仍然是未定义。因为obj已经重新指向了{}这个空对象,已经跟p1没有关系了,所以可以成功把name等属性赋值给obj,所以不报错(只不过函数运行完,函数里面的数据没有被引用着,这些数据就会被删除,释放内存)。但p1仍然是undefined。
1 <script type="text/javascript"> 2 var o = {name: "张三", age: 19, gender: "男"}; 3 // copy拷贝的第二种方法,带参数(第一种方法是return返回值) 4 o.copy = function(obj){ 5 // 此处设置obj等于一个空对象,天坑!!! 6 var obj = {}; 7 for(var k in this){ 8 obj[k] = this[k]; 9 } 10 }; 11 var p1; 12 o.copy(p1); 13 </script>
例3:正确做法,直接在外面声明p1位一个空对象。这样参数obj也指向了同一个空对象,只要obj改变了,p1也随之改变。
1 <script type="text/javascript"> 2 var o = {name: "张三", age: 19, gender: "男"}; 3 // copy拷贝的第二种方法,带参数(第一种方法是return返回值) 4 o.copy = function(obj){ 5 for(var k in this){ 6 obj[k] = this[k]; 7 } 8 }; 9 // 正确做法,直接在外面声明p1位一个空对象。 10 var p1 = {}; 11 o.copy(p1); 12 </script>
总结:
函数的参数,其实就是一个赋值过程,只不过“赋值”是直接赋值,而“参数”是隐形赋值看不见。