浅谈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 GridView 实现自动计算操作代码
Mar 25 Javascript
jquery获取自定义属性(attr和prop)实例介绍
Apr 21 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
Aug 08 Javascript
JQuery实现table行折叠效果以JSON做数据源
May 26 Javascript
js实现的后台左侧管理菜单代码
Sep 11 Javascript
javascript设计简单的秒表计时器
Sep 05 Javascript
javascript每日必学之多态
Feb 23 Javascript
JavaScript中的事件委托及好处
Jul 12 Javascript
vue.js指令和组件详细介绍及实例
Apr 06 Javascript
浅谈Vue Element中Select下拉框选取值的问题
Mar 01 Javascript
微信小程序实现长按删除图片的示例
May 18 Javascript
jQuery中event.target和this的区别详解
Aug 13 jQuery
如何利用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源代码数组统计count分析
2011/08/02 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
微信小程序嵌入腾讯视频源过程详解
2019/08/08 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
vscode 远程调试python的方法
2017/12/01 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
浅析PEP572: 海象运算符
2019/10/15 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
数控技术专科生自我评价
2014/01/08 职场文书
捐书寄语赠言
2014/01/18 职场文书
2014新年寄语
2014/01/20 职场文书
商场消防演习方案
2014/02/12 职场文书
教师业务学习材料
2014/12/16 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript
mysql sock文件存储了什么信息
2022/07/15 MySQL