浅谈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面向对象编程 for Cookie
Sep 19 Javascript
一个JavaScript变量声明的知识点
Oct 28 Javascript
javascript搜索框点击文字消失失焦时文本出现
Sep 18 Javascript
javascript面向对象之访问对象属性的两种方式分析
Jan 13 Javascript
jQuery结合ajax实现动态加载文本内容
May 19 Javascript
jQuery 遍历函数详解
Jul 05 Javascript
js判断数组key是否存在(不用循环)的简单实例
Aug 03 Javascript
JavaScript中定义对象原型的两种使用方法
Dec 15 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
Feb 25 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
Mar 19 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
May 27 Javascript
Vue双向绑定实现原理与方法详解
May 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 jsonp单引号转义
2014/11/23 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
Nodejs模块载入运行原理
2018/02/23 NodeJs
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
详解JavaScript中的强制类型转换
2019/04/15 Javascript
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
进一步探究Python的装饰器的运用
2015/05/05 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
浅谈Python的list中的选取范围
2018/11/12 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
用python发送微信消息
2020/12/21 Python
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
企业管理专业个人求职信范文
2013/09/24 职场文书
农民致富事迹材料
2014/01/23 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
分居协议书范本
2014/11/03 职场文书
小学班长竞选稿
2015/11/20 职场文书