浅谈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 jQuery中的DOM操作
Mar 21 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
Feb 23 Javascript
JavaScript词法作用域与调用对象深入理解
Nov 29 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
Mar 18 Javascript
JS截取url中问号后面参数的值信息
Apr 29 Javascript
javascript下拉框选项单击事件的例子分享
Mar 04 Javascript
浅谈JavaScript字符串与数组
Jun 03 Javascript
全面解析Bootstrap中transition、affix的使用方法
May 30 Javascript
vue-cli的webpack模板项目配置文件分析
Apr 01 Javascript
详解ES6中的 Set Map 数据结构学习总结
Nov 06 Javascript
vue父组件给子组件的组件传值provide inject的方法
Oct 23 Javascript
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
如何利用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脚本的10个技巧(3)
2006/10/09 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
PHP实现文件上传与下载
2020/08/28 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
JS 分号引起的一段调试问题
2009/06/18 Javascript
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
python邮件发送smtplib使用详解
2020/06/16 Python
基于python实现简单日历
2018/07/28 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
银行自荐信范文
2013/10/07 职场文书
大学社团活动总结
2014/04/26 职场文书
家长会欢迎标语
2014/06/24 职场文书
大一新生期末自我评价
2014/09/12 职场文书
解析Redis Cluster原理
2021/06/21 Redis
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python