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>

     总结:

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

  • 相关阅读:
    nginx+php-fpm 配置和错误总结
    C#——Winform 无边框随意拖动【转载】
    C#——Socket
    asp.net——Base64加密解密
    asp.net——上传图片生成缩略图
    C#——获取远程xml文件
    SQL Server—— 如何创建定时作业
    asp.net——正则表达式
    asp.net——Josn转DataTable(转)
    JS——EasyuiCombobox三级联动
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/6659573.html
Copyright © 2011-2022 走看看