博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重读传递参数
阅读量:6843 次
发布时间:2019-06-26

本文共 1065 字,大约阅读时间需要 3 分钟。

hot3.png

书中有这么3句话:

  • 所有函数的参数都是按值传递的。

  • 访问变量有按值和按引用两种方式。

  • 不少开发人员在这一点上可能会感到困惑。

第一次读的时候,懵懵懂懂。既然传递是复制,复制有两种方式,那怎么函数中的传递只有一种方式呢?

我解决问题,尤其是这种特别绕的问题的时候,思路只是一个:细分步骤,越细越好,透彻每一步,加上敏锐的嗅觉,问题实质自然会浮出水面。下面我们就来细分一下这个过程,依旧是书上的实例:

  • 参数是基本类型

function addTen(num){    num += 10;    return num;    }var count = 20;var result = addTen(count);alert(count);        // 20alert(result);       // 30
  • 参数是引用类型

function setName(obj){    obj.name = "Nicholas";    }ver person = new Object();setName(person);alert(person.name);        // Nicholas

这两个例子中,包含着两个重要的过程。第一个过程发生在函数外部,函数外部变量传递(复制)到函数参数,这一步是按值传递;第二个过程发生在函数内部,在运行函数需要调用参数值的时候,若参数是基本类型,直接读取复制过来的值,而若参数是引用类型,不能直接读取变量的值,而是读取复制来的引用,这时,读取数据就是按引用访问。“函数参数都是按值传递的”说的是第一个过程,第二个过程中引用类型仍会按引用访问对象。

171554_DoFQ_2343906.png

为了更深入的理解,书中又给了一个例子:

function setName(obj){    obj.name = "Nicholas";    obj = new Object();    obj.name = "Greg";}var person = new Object();setName(person);alert(person.name);        // Nicholas

这里如果person是按引用传递的话,person就会自动被修改为指向其name属性值为“Greg”的新对象。

而事实上,person是按值传递的。可以将它类比第一个例子,在函数内部改变参数的值,并不会影响外部变量。内部修改参数的值,原始的引用不会改变。

转载于:https://my.oschina.net/hiYoHoo/blog/415727

你可能感兴趣的文章
C# asp.net常见编译|运行错误
查看>>
Ajax登录页面
查看>>
Linux查看系统block size的多种方法
查看>>
用SNMP实现对大型网络的轻松管理!
查看>>
Docker 组件如何协作?- 每天5分钟玩转容器技术(8)
查看>>
员工的不幸?还是公司的悲哀?
查看>>
配置Nginx之后,打不开html网页
查看>>
python 常用的模块 optparse与ConfigParser
查看>>
C++ 对象的内存布局(下)
查看>>
RHS333-9 Vsftp
查看>>
多进程与多线程(1)
查看>>
P2P系统仿真: oversim+INET+omnetPP
查看>>
[Unity3d]小地图的制作
查看>>
配置 VirtualBox backend - 每天5分钟玩转 Docker 容器技术(75)
查看>>
频繁变化的表无效索引造成的热点块争用
查看>>
Exchange2003 反垃圾邮件之一
查看>>
IP phone 显示 Configuring IP.....
查看>>
HTTP 头部解释
查看>>
Linux系统管理(一):定时任务Crontab命令
查看>>
linux中scp命令的使用
查看>>