浅谈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 相关文章推荐
20个非常有用的PHP类库 加速php开发
Jan 15 Javascript
Jquery倒数计时按钮setTimeout的实例代码
Jul 04 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
Dec 24 Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 Javascript
Jquery解析json字符串及json数组的方法
May 29 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
May 21 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 Javascript
小程序实现列表点赞功能
Nov 02 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
Jul 15 Javascript
Vue 实现从文件中获取文本信息的方法详解
Oct 16 Javascript
javascript实现弹幕墙效果
Nov 28 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
Sep 21 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+oracle 分页类
2006/10/09 PHP
PHP 数据库树的遍历方法
2009/02/06 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
smarty缓存用法分析
2014/12/16 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
jQuery链使用指南
2015/01/20 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
python实现数通设备端口监控示例
2014/04/02 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
中药专业大学生医药工作求职信
2013/10/25 职场文书
工程部岗位职责范本
2015/04/11 职场文书
对学校的意见和建议
2015/06/04 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
深入理解python多线程编程
2021/04/18 Python
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL