ECMAScript 中所以函数的参数都是按值传递

函数的参数都是按值传递(浅拷贝)

变量有按访问和按引用访问,传参只有按传递

函数外的值会被复制到函数内部的参数中,同一个变量复制到另一个变量中

如果是原始值,那么跟原始值变量复制一样(即另一个值)

如果是引用值,那么跟引用值变量复制一样(即另一个引用,这个引用可以修改外部对象的属性,但重写这个引用时并不会修改外部的值

按值传递参数

值会被复制到一个局部变量(即命名参数)

function addTen(num) {
    num += 10
    return num
}
let count = 20
let result = addTen(count)
console.log(count) // 20
console.log(result) // 30

count 原始值直接复制一份到 num

function setName(obj) {
    obj.name = "Nicholas"
}
let person = new Object()
setName(person)
console.log(person.name) // "Nicholas"

这里即使对象是按值传进函数,obj 也会通过引用访问对象

当函数内部给 obj 设置了 name 属性时,函数外部对象也会反映这个变化,因为 obj 指向的对象保存在全局作用域的堆内存上

function setName(obj) {
    obj.name = "Nicholas"
    obj = new Object()
    obj.name = "Greg"
}
let person = new Object()
setName(person)
console.log(person.name) // "Nicholas"

如果 person 是按引用访问,则 person 会指向 name 为 Greg 的新对象。但这里并没有,因为函数参数的值改变之后,原始的引用仍然没变,当 obj 在函数内部重写时,会变成一个指向本地对象的指针。

上一篇:开始python成长之路


下一篇:Javascript