ECMAScript中所有函数的参数都是按值传递的。
把函数外部的值复制给函数内部的参数,和把值从一个变量复制到另一个变量是一样的。
1、在向函数传递基本类型的时候,被传递的值会被赋值给一个局部变量。
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20
alert(result); //30
2、在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映到函数的外部.
demo1
function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name ); //"Nicholas"
demo2
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Grey";
}
var person = new Object();
setName(person);
alert(person.name ); //"Nicholas"
demo中person.name的值并不是"Gery",可以看出传递引用类型的时候,并不是按引用传递,而是按值传递。
它传递的的确是引用,但实际上他应用的策略却是 call by sharing。通俗的说就是,它并不是把引用直接传递进去,而是把引用的拷贝传递进去存储在函数内部的AO对象里。
更简单点理解,就是在函数里面创建了一个局部变量obj, obj = person(传入的参数), 因此obj是一个局部变量。(适用于基本类型和引用类型)。
关于按值传递和按引用传递的更详细的解释可以参考下面这边文章,讲的比较明白https://www.zhihu.com/question/27114726/answer/35481766
网友评论