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 相关文章推荐
在VS2008中使用jQuery智能感应的方法
Dec 30 Javascript
imgAreaSelect 中文文档帮助说明
Oct 08 Javascript
jQuery中:reset选择器用法实例
Jan 04 Javascript
javascript中DOM复选框选择用法实例
May 14 Javascript
jQuery实现平滑滚动的标签分栏切换效果
Aug 28 Javascript
js过滤HTML标签完整实例
Nov 26 Javascript
jQuery动画效果相关方法实例分析
Dec 31 Javascript
javascript深拷贝和浅拷贝详解
Feb 14 Javascript
js实时监控文本框输入字数的实例代码
Jan 18 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
Sep 03 Javascript
ES6 系列之 Generator 的自动执行的方法示例
Oct 19 Javascript
20道JS原理题助你面试一臂之力(必看)
Jul 22 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
PHP高自定义性安全验证码代码
2011/11/27 PHP
浅谈PHP中的
2016/04/23 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
厨房工作人员岗位职责
2013/11/15 职场文书
化工专业求职信
2014/07/01 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
安全教育主题班会教案
2015/08/12 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
PHP解决高并发问题
2021/04/01 PHP