js中的函数里:
1.如果传入的参数为基本类型(number, string, boolean)时,传入实际的值(而不是地址)
2.如果传入的参数为引用类型(object, array,map等)时,传入内存地址,此时对形参的修改才相当于对原值的修改。
例1:
var a =10
function test(a){ //a作为形参,不会被外部的全局a代替
a = a + 10 //a是数字类型,传入时只传入值,而不传入地址
}
test(a)
console.log(a) //输出10
解析:本例中 a作为一个全局变量被赋值为10,而在函数test中 a 则是一个形参,作为形参的a不会去寻找作为全局变量的 a ,在调用test函数时,传入的是全局变量a 的值(10),而函数并不会影响到实际的变量 a ,所以输出为10.
例2:
var a =10
function test(b){
a = b + 10 //由于函数域中没有变量a,则会在全局范围内查找变量a
}
test(a)
console.log(a) //输出20
解析:本例中之所以输出20,是test函数中的形参不再是 a 而是 b ,此时在调用test函数时,函数中的a会优先查找函数域中是否有变量a,如果没有则去全局变量中查找,而此时全局变量中有一个 a=10 ,则使用实际的变量a进行运算,修改的也是a实际上的值,所以a被修改为了20
例3:
a = { name: 'zhangsan' }
function test(a){
a.name = 'lisi'
}
test(a)
console.log(a.name) //打印lisi
解析:由于a是一个对象类型,在传入函数时传入的是内存地址,所以对新参的修改就是对原本对象的修改,故a对象的name属性被修改了。