您的位置:首页 > Web前端 > JavaScript

JS函数参数都是按值传递的!

2016-09-12 20:09 295 查看
访问变量有按值和按引用两种方式,但参数只能按值传递

在向参数传递基本类型的值时,被传递的值会被复制给命名参数,即arguments对象数组的中一个元素。在向参数传递引用类型的值时,会把这个值在内存的地址传递给命名参数即函数内的局部变量,此时若局部变量变化则可以影响到函数外部。

基本类型传值比较好理解,下面给出一个书中引用类型传值的例子:

function setName(obj){
obj.name="nick";
}
var person=new Object();
setName(person);
alert(person.name);    //"nick"


看起来似乎是把person对象整个传递给了参数,所以才导致了全局作用域中的对象变化,但其实person还是按值传递的,请看下面这个例子:

function setName(obj){
obj.name="nick";
obj=new Object();
obj.name="greg";
}

var person=new Object();
setName(person);
alert(person.name);    //"nick"

分析以上代码,用反证法证明,假设person是按引用传递的参数,则在函数中name属性已经被赋值“greg”,所以结果应该为greg才对。

其实这正是因为person是按值传递的才会有这个结果,person传递进去的是person对象的地址,当参数传递进去后被object对象实例化,就指向了一个新object实例,不再是person原来的地址了,所以再赋值也不会影响到全局作用域中的person了。

所以person只是和setName.arguments[0]的值相同,或者指向同一个对象即地址相同,只是后者被看作为一个局部变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 函数 对象