Please enable Javascript to view the contents

从头学习js-9-函数的参数传递

 ·  ☕ 2 分钟

这个系列是我读冴羽老师博客的感悟,
加入了个人的解读和练习题的解答

在《JavaScript高级程序设计》第三版 4.1.3,讲到传递参数:

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

那么js中的参数分为基本类型和引用类型

在内存中有栈和堆两个区域,栈用于储存基本类型的数据,而堆用于存放引用类型的数据
(后续还有常量区先不讲)

1
2
let a = 1;
let b = {name: 'Neo', age: 25};

以上的代码会在内存中储存数据形式大致如下:
在栈中有:
a(值为1)
b(值为一个指针,一个指向堆中对象数据的地址假设为1000)

在堆中有:
{name: ‘Neo’, age: 25}

其中指针1000指向{name: ‘Neo’, age: 25}

栈内存堆内存
a1
b指针地址1000{name: 'Neo', age: 25}

例子1:

1
2
3
4
5
6
7
var value = 1;
function foo(v) {
    v = 2;
    console.log(v); //2
}
foo(value);
console.log(value) // 1

例子1会打印
2
1

foo(value) 函数开始执行时,初始化AO,然后加入形参
执行了像var v = value这样的一个操作,把value赋值给了函数内的参数v

栈内存堆内存
value1
v1

再执行v = 2,重新赋值v

栈内存堆内存
value1
v2

例子2:

1
2
3
4
5
6
7
8
9
var obj = {
    value: 1
};
function foo(o) {
    o.value = 2;
    console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2

foo(obj) 函数开始执行时,初始化AO,然后加入形参
var o = obj,把obj值的引用赋值给了o

栈内存堆内存
obj,o 指针地址{value: 1}

此时o.value = 2会沿着引用找到obj指向的值并修改

栈内存堆内存
obj,o 指针地址{value: 2}

例子3:

1
2
3
4
5
6
7
8
9
var obj = {
    value: 1
};
function foo(o) {
    o = 2;
    console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1

foo(o) 函数开始执行时,初始化AO,然后加入形参
var o = obj,把obj值的引用赋值给了o

栈内存堆内存
obj,o 指针地址{value: 1}

此时o = 2会赋值o把指针的值覆盖修改为2

栈内存堆内存
obj 指针地址{value: 1}
o 2
分享

Llane00
作者
Llane00
Web Developer