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

JS中函数参数的传递

2016-04-08 10:17 288 查看
之前看书对这个问题理解的不透彻,这次偶然间翻到了一篇博客,加深了理解,这里记录一下。

ECMAScript中所有函数的参数是按值传递的。

在向函数传递基本类型的值时候,这个值被复制到了函数的参数局部变量中。而传递引用类型的值的时候,这个值在内存中的地址被复制给了参数中的局部变量,因此这个局部变量的值的变化会反映在函数的外部。

基本类型值的传递

<span style="color:#000000;">function addTen(num){
return num+=10;
}
var count = 20;
var result = addTen(count);
alert(count);        //20
alert(result);        //30</span>
这里看到count被当做参数传进addTen函数里边,并做了加10的操作,之后在函数外边分别访问了count和addTen返回值,count没变,返回值位count+10。这里就说明了当基本类型的值传递给函数参数的时候,只是将值复制给了函数参数。

引用类型值的传递

function setName(obj){
obj.name = 'xiaoming';
obj = new Object();
obj.name = 'xiaoqiang;'
}
var person = new Object();
person.setName(person);
alert(obj.name);        //xiaoming
这里将person对象传递到了setName函数中,person的地址就被复制给了obj,因此当第一次访问obj.name时,访问的是person.name。之后obj指向了一个新的对象的地址,这时再访问name属性就不是函数参数obj了,而是另外一个新的对象,当函数运行结束时,这个新的对象也就被销毁了。

另外一个例子:

var o1 = []
var o2 = {};
function foo(o1, o2)
{
o1 = [1];
o2 = {a:3}
}

foo(o1, o2);
alert (o1); // 空白
alert (o2.a); // undefined


从这个例子里可以看到,在foo函数里边对o1,o2进行直接的赋值操作,然后在函数外部访问,没有起到效果。原因就是在函数内部改写了局部函数的指向,指向了新的数组和对象,所以没有效果。

function get(value,arr){
console.log(1);
}
var o1 = []
var o2 = {};
function foo(o1, o2)
{
o1[0] = 1;
o2.a = 3;
}

foo(o1, o2);
console.log(o1); // [1]
console.log(o2.a); // 3


上边在修改局部变量的时候,访问的是函数的属性,这时就可以成功的修改传入参数了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: