js函数参数传递问题

JS函数传递参数问题

js中所有函数的参数都是按值传递的, 也就是说把函数外部的值复制给函数内部的参数, 就如同把一个变量赋值给另一个变量一样.

  • 基本类型值传递如同基本类型变量复制一样
  • 引用类型则同引用类型变量的复制一样

基本类型值传递

定义一个处理函数, 传递给函数一个数值类型的值, 只会修改韩顺局部变量的值. 而不会修改外部变量

1
2
3
4
5
6
7
function handleNum(num) {
num++;
console.log('FNnum:'+num); // 11
}
var num = 10;
handleNum(num);
console.log('num:'+num); // 10

引用类型值传递

对象传递的是地址, 函数内外的变量会根据引用访问同一个对象, 因为堆中对应的地址只有一个.

1
2
3
4
5
6
7
function handleObj(obj) {
obj.name = 'jack';
console.log('FNobj:'+JSON.stringify(obj.name)); // jack
}
var parson = new Object();
handleObj(parson);
console.log('parson:'+JSON.stringify(parson.name)); // jack

看到这个例子后, 很多人会认为, 在局部作用域修改的对象会在全局作用域中反映出来, 就说明引用类型是按引用传递的, 再看接下来一个例子

1
2
3
4
5
6
7
8
9
10
11
function handleObj(obj) {
obj.name = 'jack';
// -------------------------
obj = new Object();
obj.name = 'ruth'
// -------------------------
console.log('FNobj:' + JSON.stringify(obj.name)); // ruth
}
var person = new Object();
handleObj(person);
console.log('person:' + JSON.stringify(person.name)); // jack

这个例子与上面的例子唯一的不同就是添加了两行代码, 一行是为obj重新定义了一个新的对象, 另一行是为这个新对象重新设置了name的属性为’ruth’.

如果引用类型是按照引用传递的话, 全局变量的person的name属性也会修改为’ruth’才对, 但是person的name属性值依然是’jack’;

实际上, 当函数内部重写obj的时候, 这个变量引用就是一个局部对象了, 再函数执行完毕后会立即销毁

坚持原创技术分享,您的支持将鼓励我继续创作!