js中函数的参数传递方式

2019-01-07  本文已影响0人  沧澈

ECMAScript中所有函数的参数都是按值传递的。
也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

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高级程序设计》

上一篇 下一篇

猜你喜欢

热点阅读