您的位置:首页 > Web前端 > JavaScript

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

2017-04-02 18:54 507 查看
说明(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>


总结:

函数的参数,其实就是一个赋值过程,只不过“赋值”是直接赋值,而“参数”是隐形赋值看不见。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐