JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享


Posted in Javascript onJuly 02, 2013

对于“JavaScript 函数参数是传值(byVal)还是传址(byRef)”这个问题,普遍存在一个误区:number,string等“简单类型”是传值,Number, String, Object, Array等“复杂类型”是传址。
这样不对吗?为什么会有这样的误区?看一下这两段代码:

//造成传值假象的代码
function modifyLikeByVal(x){
  x = 1;
  console.log('x = %d', x);
}
var x = 0;
console.log('x = %d', x); // 输出 x = 0
modifyLikeByVal(x);  // 输出 x = 1
console.log('x = %d', x); // 输出 x = 0   x没变!

//造成传址假象的代码
function modifyLikeByRef(x){
  x[0] = 4;
  x[1] = 5;
  x[2] = 6;
  console.log('x = [ %s ]', x.join(', '));
}
var x = [1, 2, 3];
console.log('x = [ %s ]', x.join(', ')); // 输出 x = [ 1, 2, 3 ]
modifyLikeByRef(x);  // 输出 x = [ 4, 5, 6 ]
console.log('x = [ %s ]', x.join(', ')); // 输出 x = [ 4, 5, 6 ]   x变了!

于是,由以上代码得出结论,“简单类型”作为参数是传值(byVal)的,“复杂类型”作为参数是传址(byRef)的。

问题出在哪呢?

仔细观察两个函数,就可以发现一点:
在byVal中,是直接修改了参数x: x = 1;
而byRef中,是修改参数x的成员: x[0] = 4; x[1] = 5; x[2] = 6;

本人由此得出猜想:在JavaScript中,所有的变量或成员,都是一个指针,在修改变量或成员值的时候,其实是修改了该指针的地址。

这样上面的代码就可以得到解释了:

在“byVal”中:

global {  // 表示全局作用域,下面的表示函数作用域
  var x = 0;  // 初始化指针x并指向数字0
    fun(x) {
      x = global.x; // 传入参数global.x; fun域的x指针地址与global域的x指针地址一样指向数字0
      x = 1; // 修改fun域的x指针地址,指向数字1;
    } // fun 域结束,global域中的x指针没改变
}

在“byRef”中:
global {  // 表示全局作用域,下面的表示函数作用域
  /*
    初始化指针x并指向数组[1, 2, 3]
    其实是x的三个成员0, 1, 2,分别指向1, 2, 3;
  */
  var x = [1, 2, 3];  
    fun(x) {
      x = global.x; // 传入参数global.x; fun域的x指针地址与global域的x指针地址一样指向数组[1, 2, 3]
      /*
       在fun域中的x没有再被改变
       紧接着修改fun域中的x(也就是global.x)三个成员指针的指向
      */
      x[0] = 4;
      x[1] = 5;
      x[2] = 6;
    } // fun 域结束,global域中的x指针没改变,但其三个成员指针被改变了,于是就看到我们输出的结果
}

那这段代码怎么解释呢???
(function(a, b){
    arguments[0] = 1;
    b = 2;
    console.log(arguments, a, b);
})(-1, -2);

只能说a, b...,是arguments[0],...[n]的别名了。

如果有不对的地方,请指出来,谢谢。

如果有更好的解释,欢迎大家分享。

Javascript 相关文章推荐
jQuery使用手册之二 DOM操作
Mar 24 Javascript
jQuery 技巧小结
Apr 02 Javascript
比Jquery的document.ready更快的方法
Apr 28 Javascript
如何在指定的地方插入html内容和文本内容
Dec 23 Javascript
Node.js中的事件驱动编程详解
Aug 16 Javascript
JavaScript中用getDate()方法返回指定日期的教程
Jun 09 Javascript
js闭包用法实例详解
Dec 13 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
Jun 20 Javascript
node.js学习笔记之koa框架和简单爬虫练习
Dec 13 Javascript
javascript使用链接跨域下载图片
Nov 01 Javascript
uniapp实现横向滚动选择日期
Oct 21 Javascript
JavaScript实现京东快递单号查询
Nov 30 Javascript
js创建子窗口并且回传值示例代码
Jul 02 #Javascript
封装html的select标签的js操作实例
Jul 02 #Javascript
使用js获取地址栏中传递的值
Jul 02 #Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
Jul 01 #Javascript
jquery动态增加text元素以及删除文本内容实例代码
Jul 01 #Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
Jul 01 #Javascript
原生javascript兼容性测试实例
Jul 01 #Javascript
You might like
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
js chrome浏览器判断代码
2010/03/28 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
django解决跨域请求的问题
2018/11/11 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
java判断三位数的实例讲解
2019/06/10 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
python如何实现图片压缩
2020/09/11 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
小学开学寄语
2014/01/19 职场文书
酒店节能减排方案
2014/05/26 职场文书
建筑工地标语
2014/06/18 职场文书
语文复习计划
2015/01/19 职场文书
生死牛玉儒观后感
2015/06/11 职场文书