持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
铃铛说点题外话
上一篇里面我根据一个案例详细说了一个函数从创建到执行输出的全过程,但是函数保存在哪里呢,js是如何保存函数的呢?今天我们就来看看js对函数的保存
铃铛说正文
首先我们先看几个案例,回顾一下函数的执行过程
- NO.1
var n = 100
function foo(){
n = 200
}
foo()
console.log(n) //200
第一句执行语句是调用函数foo,在函数内部对变量n进行了修改,所以最终的输出结果为200
- NO.2
function foo(){
console.log(n) //undefined
var n = 200
console.log(n) //200
}
var n = 100
foo()
这里也是执行函数foo,函数foo里面第一个输出语句变量n在函数自身和父级作用域都未定义,所以输出undefined,第二句输出语句在函数自身会查找到变量n,所以输出为200
- NO.3
var n = 100
function foo1(){
console.log(n) //100
}
function foo2(){
var n = 200
console.log(n) //200
foo1()
}
foo2()
console.log(n) //100
第一个指定语句执行函数foo2,函数foo2里面第一个输出语句输出的是函数foo2作用域的n为200,随后调用函数foo1,函数foo1里面输出的n是函数foo1父级也就是全局作用域的n为100
以上我们根据三个案例对函数的输出有一定的了解了,但是我们的函数是存放在哪里呢?是怎么获取到父级作用域的呢?
我们先来看第一个问题,关于存储(内存管理)。 我们先要知道一个前提,就是无论什么语言都需要对代码进行内存分配,有一些语言是手动分配的,也就是需要我们手动的开辟新空间,在需要销毁的时候手动清除内存;而JS则是自动分配内存的。
不管是手动还是自动方式管理内存,都会进行一些必要的步骤:
- 分配需要申请的内存
- 使用内存
- 在不需要的时候进行内存释放
在我们的JS里面针对基本数据类型和复杂数据类型的内存管理完全不同:
- JS对于基本数据类型会直接分配到栈空间。
- JS对于复杂数据类型会在堆内存中开辟一块新的空间,并且将这块空间的指针指向变量引用。
在我们使用变量之后,针对不再使用的变量,JS会自动进行内存清理,JS中针对垃圾回收有两种方式:标记清除和引用计数。
跟铃铛说再见
这一篇我用三个案例的输出结果对JS的作用域进行了一个详细的分析,随后对JS的内存管理进行了一个讲解,明天我会详细的对JS的垃圾回收机制进行一个讲解。