对于“JavaScript 函数参数是传值(byVal)还是传址(byRef)”这个问题普遍存在一个误区numberstring等“简单类型”是传值Number String Object Array等“复杂类型”是传址
这样不对吗?为什么会有这样的误区?看一下这两段代码
复制代码 代码如下:
//造成传值假象的代码
function modifyLikeByVal(x){
x =
;
console
log(
x = %d
x);
}
var x =
;
console
log(
x = %d
x); // 输出 x =
modifyLikeByVal(x); // 输出 x =
console
log(
x = %d
x); // 输出 x =
x没变!
复制代码 代码如下:
//造成传址假象的代码
function modifyLikeByRef(x){
x[
] =
;
x[
] =
;
x[
] =
;
console
log(
x = [ %s ]
x
join(
));
}
var x = [
];
console
log(
x = [ %s ]
x
join(
)); // 输出 x = [
]
modifyLikeByRef(x); // 输出 x = [
]
console
log(
x = [ %s ]
x
join(
)); // 输出 x = [
] x变了!
于是由以上代码得出结论“简单类型”作为参数是传值(byVal)的“复杂类型”作为参数是传址(byRef)的
问题出在哪呢?
仔细观察两个函数就可以发现一点
在byVal中是直接修改了参数x x = ;
而byRef中是修改参数x的成员 x[] = ; x[] = ; x[] = ;
本人由此得出猜想在JavaScript中所有的变量或成员都是一个指针在修改变量或成员值的时候其实是修改了该指针的地址
这样上面的代码就可以得到解释了
在“byVal”中
复制代码 代码如下:
global { // 表示全局作用域
下面的表示函数作用域
var x =
; // 初始化指针x并指向数字
fun(x) {
x = global
x; // 传入参数global
x; fun域的x指针地址与global域的x指针地址一样指向数字
x =
; // 修改fun域的x指针地址
指向数字
} // fun 域结束
global域中的x指针没改变
}
在“byRef”中
复制代码 代码如下:
global { // 表示全局作用域
下面的表示函数作用域
/*
初始化指针x并指向数组[
]
其实是x的三个成员
分别指向
*/
var x = [
];
fun(x) {
x = global
x; // 传入参数global
x; fun域的x指针地址与global域的x指针地址一样指向数组[
]
/*
在fun域中的x没有再被改变
紧接着修改fun域中的x(也就是global
x)三个成员指针的指向
*/
x[
] =
;
x[
] =
;
x[
] =
;
} // fun 域结束
global域中的x指针没改变
但其三个成员指针被改变了
于是就看到我们输出的结果
}
那这段代码怎么解释呢???
复制代码 代码如下:
(function(a
b){
arguments[
] =
;
b =
;
console
log(arguments
a
b);
})(
);
只能说a b是arguments[][n]的别名了
如果有不对的地方请指出来谢谢
如果有更好的解释欢迎大家分享