ECMAScript中所有函数的参数都是按值传递的。
也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
- 向参数传递基本类型值
传递一个基本类型值时,被传递的值会被复给一个局部变量(arguments中的一个元素)
function add(num) {
num += 10;
return num;
}
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时,这个变量的引用就是一个局部变量了,而这个局部变量会在函数执行完毕后立即被销毁。
参考:《javaScript高级程序设计》
网友评论