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知识点一 Jquery的ready和Dom的onload的区别
Jan 15 Javascript
ajax 同步请求和异步请求的差异分析
Jul 04 Javascript
jQuery实现form表单reset按钮重置清空表单功能
Dec 18 Javascript
html+css+js实现xp window界面及有关功能
Mar 26 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
Aug 26 Javascript
JavaScript 封装一个tab效果源码分享
Sep 15 Javascript
利用Javascript实现简单的转盘抽奖
Feb 13 Javascript
微信小程序 POST请求的实例详解
Sep 29 Javascript
Angular4的输入属性与输出属性实例详解
Nov 29 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 Javascript
Vue实现附件上传功能
May 28 Javascript
JavaScript中MutationObServer监听DOM元素详情
Nov 27 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
上传多个文件的PHP脚本
2006/11/26 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
用jquery来定位
2007/02/20 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
vue中input的v-model清空操作
2019/09/06 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
详解Django中Request对象的相关用法
2015/07/17 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
Java分治归并排序算法实例详解
2017/12/12 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
中秋节超市促销方案
2014/01/30 职场文书
环保公益广告语
2014/03/13 职场文书
商务英语广告词大全
2014/03/18 职场文书
通知函的格式
2015/04/27 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
甲午大海战观后感
2015/06/02 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书