先看个传参为原始值的例子
function add (num) { // num其实是一个局部变量,是(在add函数被调用时候)count被复制到参数num的
num += 10
return num
}
let count = 100
add(100)
console.log(count) // 100 不受函数内部干扰,事实是参数num和变量count互不干扰
下面讨论传参是引用值的例子
function setName (obj) {
obj.name = 'zhangsan'
}
let person = new Object()
setName(person)
console.log(person.name) // zhangsan
当调用函数,函数内部给obj设置了name值,函数外部也反映了这个变化,但不代表函数传参是按引用传参。之所以函数外部也被干扰,是因为obj指向的对象保存在全局作用域的堆内存上。
再看下面这个例子可以证明对象是按值传递的
function setName(obj) {
obj.name = 'zhangsan'
obj = new Object()
obj.name = 'lisi'
}
let person = new Object()
setName(person)
console.log(person.name) // zhangsan
如果person是按引用传递的,那么person应该将指针改为name为lisi的对象,但我们访问person.name时,原始的引用仍然没变。
当obj在本地被重写时,它变成了指向本地的指针,与函数外部的互不干扰。(这个本地对象在函数执行结束时被销毁了)