首页 > 代码库 > JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性

JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性

说明(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>

 总结:

函数的参数,其实就是一个赋值过程,只不过“赋值”是直接赋值,而“参数”是隐形赋值看不见。

JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性