浅谈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 相关文章推荐
Javascript !!的作用
Dec 04 Javascript
jquery focus(fn),blur(fn)方法实例代码
Dec 16 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
Jun 09 Javascript
告诉你什么是javascript的回调函数
Sep 04 Javascript
javascript实现校验文件上传控件实例
Apr 20 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
Jun 22 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
jQuery 常见小例汇总
Dec 14 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
Dec 14 Javascript
微信小程序实现折线图的示例代码
Jun 07 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
Sep 14 Javascript
JS实现基本的网页计算器功能示例
Jan 16 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
PHP 类相关函数的使用详解
2013/05/10 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
event.srcElement+表格应用
2006/08/29 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
js实现滑动触屏事件监听的方法
2015/05/05 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
JS快速实现移动端拼图游戏
2016/09/05 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
微信小程序开发技巧汇总
2019/07/15 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
Python执行时间的计算方法小结
2017/03/17 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
Python 查看文件的读写权限方法
2018/01/23 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
24式加速你的Python(小结)
2019/06/13 Python
python调用webservice接口的实现
2019/07/12 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
俄罗斯女装店:12storeez
2019/10/25 全球购物
体育专业自荐书
2014/05/29 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
大学开学感言
2015/08/01 职场文书
Python中threading库实现线程锁与释放锁
2021/05/17 Python
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android