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 相关文章推荐
各种常用浏览器getBoundingClientRect的解析
May 21 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
Oct 22 Javascript
JavaScript起点(严格模式深度了解)
Jan 28 Javascript
JavaScript获取两个数组交集的方法
Jun 09 Javascript
javascript省市区三级联动下拉框菜单实例演示
Nov 29 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
Sep 05 Javascript
聊一聊JS中的prototype
Sep 29 Javascript
简单实现jquery焦点图
Dec 12 Javascript
vue实现微信获取用户信息的方法
Mar 21 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
Sep 10 jQuery
使用 JavaScript 创建并下载文件(模拟点击)
Oct 25 Javascript
JavaScript函数柯里化
Nov 07 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中利用XML技术构造远程服务(上)
2006/10/09 PHP
强烈推荐:php.ini中文版(2)
2006/10/09 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
golang与PHP输出excel示例
2016/07/22 PHP
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
express 项目分层实践详解
2018/12/10 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
[36:13]Mineski vs iG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
python Flask实现restful api service
2017/12/04 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
iPython pylab模式启动方式
2020/04/24 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
设计大赛策划方案
2014/06/13 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
小学六一主持词开场白
2015/05/28 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL