函数的两个阶段做的事情以及 一个不销毁的函数执行空间
函数的两个阶段做的事情
+ 函数定义阶段
1. 开辟一个空间
2. 把代码一摸一样的存储进去(不解析变量)
3. 把空间地址赋值给变量名(函数名)
+ 函数调用阶段
1. 按照地址找到空间
2. 形参赋值
3. 预解析
4. **在内存中单独开辟一个空间**
5. **把之前存储的代码拿出来放在这个空间中执行(解析变量)**
(函数的每一次执行都会生成一个函数执行空间)
6. **把新开辟出来的执行空间销毁**
一个不销毁的函数执行空间
+ 当函数内部返回了一个复杂数据类型的时候
+ 并且在函数外部还有变量在接受的时候
+ 这个函数执行空间不会销毁,会一直存在
这个不销毁的空间能不能销毁?
+ 可以销毁
+ 当外部接受的变量不在引用着函数执行空间内部的这个复杂数据类型的时候
+ 这个函数执行空间就销毁了
<script>
function fn() {
var obj = {
name: 'Jack',
age: 18
}
return obj
}
var res = fn()
// console.log(res) // 对象
// 函数的每一次执行都会生成一个函数执行空间,故res2指向一个新的执行空间
var res2 = fn()
// console.log(res2) // 对象
// 修改了 res 这个对象内部的 name 成员
res.name = 'Rose'
console.log(res) // name => Rose
console.log(res2) // name => Jack
// 当这个 res 不在执行函数的执行空间内部的复杂数据类型的时候
// 这个函数执行空间就销毁了
// res = 100
</script>
