js中函数的参数传递⽅式
js中函数的参数传递⽅式
ECMAScript中所有函数的参数都是按值传递的。
也就是说,把函数外部的值复制给函数内部的参数,就和把值从⼀个变量复制到另⼀个变量⼀样。
向参数传递基本类型值
传递⼀个基本类型值时,被传递的值会被复给⼀个局部变量(arguments中的⼀个元素)
function add(num){
num +=10;
return num;
}
js arguments
var count =20;
var res =add(count);
console.log(count);//20
console.log(res);//30
变量count作为参数传递给函数,在函数内部,参数num被加10,但是这⼀变化不会影响函数外部的count变量。
向参数传递引⽤类型值
传递⼀个引⽤类型值时,会把这个值在堆内存中的地址复制给⼀个局部变量,因此这个局部变量的变化会反映在函数的外部。
function setName(obj){
obj.name ='hello';
}
var person =new Object();
setName(person);
console.log(person.name);//  hello
以上代码创建了⼀个对象,并将其保存在了变量person中,这个对象被传递到了setName函数中被复制给了obj。在函数内部,obj和person引⽤的是同⼀个对象,于是在函数内部为obj添加⼀个name属性后,外部的person也会有所反应,因为person指向的对象在内存中只有⼀个,⽽且是全局对象。
但是函数的参数并不是按引⽤传递的,⽽是按值传递的。
function setName(obj){
obj.name ="hello";
obj =new Object();
obj.name ='world';
}
var person =new Object();
setName(person);
console.log(person.name);// hello
以上代码中,在把person传递给setName函数后,其name属性被设置为‘hello’。然后,⼜将⼀个新的对象赋值给obj,同时将其name设置为‘world’的新对象。但是,接下来再访问person.name时,显⽰的仍然是‘hello‘,这说明即使在函数内部修改了参数的值,但是原始的引⽤仍然不变。
实际上,当在函数内部重写obj时,这个变量的引⽤就是⼀个局部变量了,⽽这个局部变量会在函数执⾏完毕后⽴即被销毁。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。