参数传递
参数实际上是函数的局部变量
参数是按值传递的:
向参数传递基本类型值-被传递的值会被复制给一个局部变量(即命名参数,就是arguments对象中的一个元素)
function addTen(num){ num += 10; return num; } var count = 20; var result = addTen(count); console.log(count); //20 在函数内部参数num被加上了10,但不会影响函数外部的count变量。 console.log(result ); //30
向参数传递引用类型值-会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
如下面向参输传递对象
function setName(obj){ obj.name = "wxc"; } var person = new Object(); setName(person); console.log(person.name); //wxc
以上代码中创建了一个对象,将其保存在了变量person中,然后这个对象被传递到setName()函数中之后就被复制给了obj.在函数内部obj和person引用的是同一个对象。于是当在函数内部为obj添加name属性后,函数外部的person也将有所反映;因为person指向的对象在堆内存中只有一个,且是全局对象。
下面的例子更说明了参数按值传递
function setName(obj){ obj.name = "wxc"; obj = new Object(); //重新定义了一个对象, obj.name = "henji"; //为该对象定义了一个带有不同值得name属性 } var person = new Object(); setName(person); console.log(person.name); //wxc 说明即使在函数内部修改了参数的值,但原始的引用仍然保持不变,实际上 当函数内部重写obj时,这个变量引用的就是一个局部对象了,而这个局部对象会在函数执行完毕后立即被销毁。