浅谈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下判断一个元素是否存在的代码
Mar 05 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
Sep 23 Javascript
Knockoutjs快速入门(经典)
Dec 24 Javascript
js截取字符串的两种方法及区别详解
Nov 05 Javascript
10条建议帮助你创建更好的jQuery插件
May 18 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
Oct 24 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
Jul 11 jQuery
vue脚手架搭建过程图解
Jun 06 Javascript
Vue加载组件、动态加载组件的几种方式
Aug 31 Javascript
three.js搭建室内场景教程
Dec 30 Javascript
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
ajax请求前端跨域问题原因及解决方案
Oct 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小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
页面版文本框智能提示JS代码
2009/11/20 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
vue v-model的用法解析
2020/10/19 Javascript
python3写爬取B站视频弹幕功能
2017/12/22 Python
Python实现的堆排序算法示例
2018/04/29 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
django 取消csrf限制的实例
2020/03/13 Python
python 6行代码制作月历生成器
2020/09/18 Python
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
售后专员岗位职责
2013/12/08 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
欢迎词范文
2015/01/27 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
带你了解Java中的ForkJoin
2022/04/28 Java/Android
PYTHON InceptionV3模型的复现详解
2022/05/06 Python