浅谈JavaScript 函数参数传递到底是值传递还是引用传递


Posted in Javascript onAugust 23, 2016

在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是值传递和引用传递都具备。那么JS的参数传递到底是怎么回事呢?事实上以下的演示也完全可以用于Java

首先来一个比较简单的,基本类型的传递:

function add(num){
  num+=10;
  return num;
}
num=10;
alert(add(num));
aelrt(num);
//输出20,10

对于这里的输出20,10,按照JS的官方解释就是在基本类型参数传递的时候,做了一件复制栈帧的拷贝动作,这样外部声明的变量num和函数参数的num,拥有完全相同的值,但拥有完全不同的参数地址,两者谁都不认识谁,在函数调用返回的时候弹出函数参数num栈帧。所以改变函数参数num,对原有的外部变量没有一点影响。

再来看一个较复杂的,对象引用类型的传递:

function setName(obj){
  obj.name="ted";
}
var obj=new Object();
setName(obj);
alert(obj.name);
//输出ted

以上代码的运行的实质是:创建了一个object对象,将其引用赋给obj(在C里面就直接是一个内存地址的赋值),然后在传递函数参数的时候,做了一件与前一个方法相同的事情,复制了一个栈帧给函数参数的obj,两者拥有相同的值(不妨将其理解为object对象的地址),然后在setName做改变的时候,事实上是改变了object对象自身的值(在JAVA里称之为可变类),在改变完成之后同样也要弹出函数参数obj对应的栈帧。

所以对应的输出是改变后object对象的值

那么可能有的朋友可能会问,这样也可以理解为一个引用传递(指针传递)呀?不,这里严格的说,在和JAVA类似的语言中,已经没有了指针,在JAVA里将上述过程称之为一个从符号引用到直接引用的解析过程。在C里面,指针就是一个具有固定长度的类型(在大多数的C编译器里是2个字节),但在JAVA类似的语言里,引用也有自己的属性和方法,只是你不能直接去访问和控制它,所以它从某种意义上也是一种对象,这种机制也很大程度的避免了内存泄露,术语称之为内存结构化访问机制。

为了证明上述观点,稍微改造下上述例子:

function setName(obj){
  obj.name="ted";
  obj=new Object();
  obj.name="marry";
}
var obj=new Object();
setName(obj);
alert(obj.name);
//输出ted

这个例子与上一个例子的唯一不同是这里将一个新的对象赋给了函数参数obj,这样函数参数obj和原有的引用obj参数,有着完全不同的值和内存地址。

以上这篇浅谈JavaScript 函数参数传递到底是值传递还是引用传递就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js清理Word格式示例代码
Feb 13 Javascript
无刷新预览所选择的图片示例代码
Apr 02 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
Jun 21 Javascript
Javascript 5种方法实现过滤删除前后所有空格
Jun 22 Javascript
javascript 判断是否是微信浏览器的方法
Oct 09 Javascript
Angular.js中$apply()和$digest()的深入理解
Oct 13 Javascript
js仿京东轮播效果 选项卡套选项卡使用
Jan 12 Javascript
原生js实现日期计算器功能
Feb 17 Javascript
jquery横向纵向鼠标滚轮全屏切换
Feb 27 Javascript
使用Bootrap和Vue实现仿百度搜索功能
Oct 26 Javascript
解决Mac安装thrift因bison报错的问题
May 17 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
Nov 09 Javascript
如何利用JSHint减少JavaScript的错误
Aug 23 #Javascript
jQuery事件处理的特征(事件命名机制)
Aug 23 #Javascript
深入浅出 jQuery中的事件机制
Aug 23 #Javascript
javascript实现简单的on事件绑定
Aug 23 #Javascript
js实现图片淡入淡出切换简易效果
Aug 22 #Javascript
JS对HTML表格进行增删改操作
Aug 22 #Javascript
AngularJS中$http服务常用的应用及参数
Aug 22 #Javascript
You might like
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
Python内置函数—vars的具体使用方法
2017/12/04 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
浅谈tensorflow模型保存为pb的各种姿势
2020/05/25 Python
python如何写出表白程序
2020/06/01 Python
Python控制台实现交互式环境执行
2020/06/09 Python
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
2014春晚主持词
2014/03/25 职场文书
解除施工合同协议书
2014/10/17 职场文书
简易离婚协议书范本
2014/10/24 职场文书
教师网络培训心得体会
2016/01/09 职场文书
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python
Python实现制作销售数据可视化看板详解
2021/11/27 Python