浅谈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 相关文章推荐
关于Jquery操作Cookie取值错误的解决方法
Aug 26 Javascript
js中判断用户输入的值是否为空的简单实例
Dec 23 Javascript
jquery动态改变div宽度和高度
Feb 09 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
Jun 29 Javascript
AngularJS实现根据变量改变动态加载模板的方法
Nov 04 Javascript
JavaScript之Date_动力节点Java学院整理
Jun 28 Javascript
微信小程序 循环及嵌套循环的使用总结
Sep 26 Javascript
完美解决axios在ie下的兼容性问题
Mar 05 Javascript
vue-router源码之history类的浅析
May 21 Javascript
JavaScript迭代器的含义及用法
Jun 21 Javascript
React 高阶组件HOC用法归纳
Jun 13 Javascript
React四级菜单的实现
Apr 08 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 快速排序算法详解
2014/11/10 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
div层的移动及性能优化
2010/11/16 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
jsonp原理及使用
2013/10/28 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
2014/05/23 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
windows下安装python paramiko模块的代码
2013/02/10 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
Python列表切片常用操作实例解析
2020/03/10 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
MADE法国:提供原创设计师家具
2018/09/18 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
网吧消防安全责任书
2014/07/29 职场文书
单位工作证明范文
2014/09/14 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers