浅谈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 相关文章推荐
JavaScript中this关键字使用方法详解
Mar 08 Javascript
JS对文本框值的判断示例
Mar 10 Javascript
JavaScript中的类数组对象介绍
Dec 30 Javascript
深入分析Javascript跨域问题
Apr 17 Javascript
jQuery提示插件alertify使用指南
Apr 21 Javascript
基于jPlayer三分屏的制作方法
Dec 21 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
Jan 02 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
Aug 29 Javascript
javascript防抖函数debounce详解
Jun 11 Javascript
js JSON.stringify()基础详解
Jun 19 Javascript
antd 表格列宽自适应方法以及错误处理操作
Oct 27 Javascript
JavaScript中10个Reduce常用场景技巧
Jun 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中empty is_null和isset的测试
2013/06/29 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
初识javascript 文档碎片
2010/07/13 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
python小技巧之批量抓取美女图片
2014/06/06 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
python switch 实现多分支选择功能
2020/12/21 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
阿拉伯书店:Jamalon
2019/07/24 全球购物
什么是.net
2015/08/03 面试题
企划经理的岗位职责
2013/11/17 职场文书
电子商务专业推荐信范文
2013/12/02 职场文书
交通志愿者活动总结
2014/06/27 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书