浅谈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实现动态改变字体大小代码
Jan 02 Javascript
js在IE与firefox的差异集锦
Nov 11 Javascript
Javascript中的getUTCHours()方法使用详解
Jun 10 Javascript
js实现交通灯效果
Jan 13 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
Jun 12 Javascript
JS检测window.open打开的窗口是否关闭
Jun 25 Javascript
浅谈FastClick 填坑及源码解析
Mar 02 Javascript
了解javascript中变量及函数的提升
May 27 Javascript
vue中使用v-model完成组件间的通信
Aug 22 Javascript
详解ES6数组方法find()、findIndex()的总结
May 12 Javascript
手把手带你搭建一个node cli的方法示例
Aug 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
PHP.MVC的模板标签系统(三)
2006/09/05 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
2019/02/15 PHP
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Python中对列表排序实例
2015/01/04 Python
Django学习笔记之Class-Based-View
2017/02/15 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
Python包和模块的分发详细介绍
2020/06/19 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
如何转换一个字符串到enum值
2014/04/12 面试题
Shell如何接收变量输入
2012/09/24 面试题
毕业生造价工程师求职信
2013/10/17 职场文书
专业实习自我鉴定
2013/10/29 职场文书
捐款活动总结
2014/08/27 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
清洁工个人总结
2015/03/04 职场文书
个人工作年终总结
2015/03/09 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android