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 相关文章推荐
动态加载外部javascript文件的函数代码分享
Jul 28 Javascript
js indexOf()定义和用法
Oct 21 Javascript
jQuery图片的展开和收缩实现代码
Apr 16 Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
Jul 08 Javascript
Angularjs 制作购物车功能实例代码
Sep 14 Javascript
Node.js查找当前目录下文件夹实例代码
Mar 07 Javascript
JS中offset和匀速动画详解
Feb 06 Javascript
JS中的事件委托实例浅析
Mar 22 Javascript
详解搭建es6+devServer简单开发环境
Sep 25 Javascript
Vue 3.0双向绑定原理的实现方法
Oct 23 Javascript
VUE实现吸底按钮
Mar 04 Vue.js
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 mcrypt可逆加密算法分析
2011/07/19 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
Javascript 面向对象 命名空间
2010/05/13 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
JavaScript数组前面插入元素的方法
2015/04/06 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
Python库urllib与urllib2主要区别分析
2014/07/13 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
python实现猜数字小游戏
2020/03/24 Python
关于python多重赋值的小问题
2019/04/17 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
Python猴子补丁知识点总结
2020/01/05 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
趣味比赛活动方案
2014/02/15 职场文书
科技之星事迹材料
2014/06/02 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
办理护照工作证明
2014/10/10 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
长城导游词300字
2015/01/30 职场文书
2015年计生工作总结范文
2015/04/24 职场文书