前言
var a = [1],b=[1];
a==b; //fasle
var c = b;
c[0]=2;
b //[2]
c = [3];
b //[2]
解释:b对c说,我同意你跟我共用一个内存地址,你可以在我的内存地址内,修改局部成员,但是你要连我的家都给挪走,对不起 你自己走。。。
正题
ECMAScript 中所有函数的参数都是按值传递的。访问变量有按值和按引用两种方式,而参数只能按值传递。
基本类型参数传递:传给函数的是数值的一个复制,函数中对其的修改外部不可见。
var a = 1;
var b = 2;
function change(a, b) {
var c = a;
a = b;
b = c;
console.log(a); //2
console.log(b); //1
}
change(a, b);
console.log(a); //1
console.log(b); //2
引用类型参数传递:传给函数的是数值的一个引用,函数中对其属性的修改外部可见,但用新引用覆盖其则在外部不可见
var a = [1, 2, 3];
var b = [5, 6];
function change(a,b) {
a[0] = 4; //对其属性的修改外部可见
var c = a;
a = b; //用新引用覆盖
b = c;
console.log(a); //"5,6"
console.log(b); //"4,2,3"
}
change(a,b);
console.log(a); //"4,2,3"
console.log(b); //"5,6"
a,b是change函数中的变量,在调用函数时传递了a,b的引用赋给了这两个变量,但是并不能改变全局中的a,b。因为用新引用覆盖在外部不可见,因为函数只是拿到了引用 并没有权力更改引用。
var a = [1, 2, 3];
var b = [5, 6];
function change() {
var c = a;
a[0] = 4; //对其属性的修改外部可见
a = b; //用新引用覆盖
b = c;
}
change(a,b);
console.log(a); //"5,6"
console.log(b); //"4,2,3"
因为js没有块级作用域,所以它在change里找不到变量a,b就会自觉的到上层去找,所以这里的a,b是全局变量的引用。
欢迎搜索微信公众号:一线码农
或扫码关注:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。