zoukankan      html  css  js  c++  java
  • 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>

     总结:

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

  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/6659573.html
Copyright © 2011-2022 走看看