这个系列是我读冴羽老师博客的感悟,
加入了个人的解读和练习题的解答
在《JavaScript高级程序设计》第三版 4.1.3,讲到传递参数:
ECMAScript中所有函数的参数都是按值传递的。
那么js中的参数分为基本类型和引用类型
在内存中有栈和堆两个区域,栈用于储存基本类型的数据,而堆用于存放引用类型的数据
(后续还有常量区先不讲)
|
|
以上的代码会在内存中储存数据形式大致如下:
在栈中有:
a(值为1)
b(值为一个指针,一个指向堆中对象数据的地址假设为1000)
在堆中有:
{name: ‘Neo’, age: 25}
其中指针1000指向{name: ‘Neo’, age: 25}
栈内存 | 堆内存 | |
a | 1 | |
b | 指针地址1000 | {name: 'Neo', age: 25} |
例子1:
|
|
例子1会打印
2
1
foo(value) 函数开始执行时,初始化AO,然后加入形参
执行了像var v = value
这样的一个操作,把value赋值给了函数内的参数v
栈内存 | 堆内存 | ||
value | 1 | ||
v | 1 |
再执行v = 2
,重新赋值v
栈内存 | 堆内存 | ||
value | 1 | ||
v | 2 |
例子2:
|
|
foo(obj) 函数开始执行时,初始化AO,然后加入形参
var o = obj
,把obj值的引用赋值给了o
栈内存 | 堆内存 | |
obj,o | 指针地址 | {value: 1} |
此时o.value = 2
会沿着引用找到obj指向的值并修改
栈内存 | 堆内存 | |
obj,o | 指针地址 | {value: 2} |
例子3:
|
|
foo(o) 函数开始执行时,初始化AO,然后加入形参
var o = obj
,把obj值的引用赋值给了o
栈内存 | 堆内存 | |
obj,o | 指针地址 | {value: 1} |
此时o = 2
会赋值o把指针的值覆盖修改为2
栈内存 | 堆内存 | |
obj | 指针地址 | {value: 1} |
o | 2 |