浅谈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组件的一些写法
Sep 10 Javascript
javascript 运算数的求值顺序
Aug 23 Javascript
node.js不得不说的12点内容
Jul 14 Javascript
JS模拟实现Select效果代码
Sep 24 Javascript
基于JQuery的Ajax方法使用详解
Aug 16 jQuery
浅谈Angular 中何时取消订阅
Nov 22 Javascript
vue将时间戳转换成自定义时间格式的方法
Mar 02 Javascript
vue实现组件之间传值功能示例
Jul 13 Javascript
JavaScript面试技巧之数组的一些不low操作
Mar 22 Javascript
vue中nextTick用法实例
Sep 11 Javascript
vue滑动吸顶及锚点定位的示例代码
May 10 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
Jun 11 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 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
js代码实现轮播图
2020/05/04 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
Python实现的简单万年历例子分享
2014/04/25 Python
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
详解python读取image
2019/04/03 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
Python函数生成器原理及使用详解
2020/03/12 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
公关关系专员的自我评价分享
2013/11/20 职场文书
水电站项目建议书
2014/05/12 职场文书
团结演讲稿范文
2014/05/23 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
楚门的世界观后感
2015/06/03 职场文书
小学家长意见怎么写
2015/06/03 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
详解Python常用的魔法方法
2021/06/03 Python
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js