浅谈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 相关文章推荐
WordPress 插件——CoolCode使用方法与下载
Jul 02 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
Javascript 运动中Offset的bug解决方案
Dec 24 Javascript
javascript实现限制上传文件大小
Feb 06 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
Jan 23 Javascript
AngularJS 单元测试(二)详解
Sep 21 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
Mar 25 Javascript
react实现菜单权限控制的方法
Dec 11 Javascript
微信小程序实现导航栏选项卡效果
Jun 19 Javascript
vue如何实现自定义底部菜单栏
Jul 01 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
Jan 26 Javascript
vue-cli设置css不生效的解决方法
Feb 07 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
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
jquery 插件 人性化的消息显示
2008/01/21 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
微信小程序自定义菜单切换栏tabbar组件代码实例
2019/12/30 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
python中def是做什么的
2020/06/10 Python
什么是serialVersionUID
2016/03/04 面试题
网上开店必备创业计划书
2014/01/26 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
中学生评语大全
2014/04/18 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
2014年销售工作总结
2014/12/01 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
高老头读书笔记
2015/06/30 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
vue实现同时设置多个倒计时
2021/05/20 Vue.js