js变量、作用域、内存
传递参数
function setName(obj) {
obj.name = '小明'
}
var person = new Object()
setName(person)
console.log(person.name) // '小明'
注意:
在以上代码中创建了一个对象,并将其保存在了变量person中。然后,这个变量被传递到了setName()函数中之后就被复制给了obj。在这个函数内部,obj和person引用的是同一个对象。换句话说,即使这个变量是按值传递的,obj也会按引用来访问同一个对象。于是,当在函数内部为obj添加name属性后,函数外部的person也将有所反应。因为person指向的对象在堆内存中只有一个,而且是全局对象。有很多开发人员错误的认为:在局部作用域中修改的对象会在全局作用域中反应出来,就说明参数是按引用传递的。以下这个例子将证明对象是按值传递的。
function setName(obj) {
obj.name = '李华'
obj = new Object()
obj.name = '小明'
}
var person = new Object()
setName(person)
console.log(person.name) // '李华'
注意:
在上述代码中,为obj重新定义了一个对象,且为该对象定义了一个带有不同值的name属性。如果person是按引用传递的,那么person就会自动被修改为指向其name属性值为“小明”的新对象。这说明了即使在函数内部修改了参数的值,但原始的引用依然保持不变。实际上,当在函数内部重写obj时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。
可以把ECMAScript函数的参数想象成局部变量