持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
闭包
闭包是指那些能够访问自由变量的函数,自由变量是指在函数中使用,但既不是函数的参数也不是函数的局部变量的变量。闭包=函数+函数能够访问自由变量。从理论上讲,所有的js函数都是闭包,但实际角度,即使创建它的上下文已经被销毁,它让然存在(比如,内部函数从父函数中返回),在代码中引用了自由变量。
var scope = 'Global Scope';
function checkscope(){
var scope = 'Local Scope';
function f(){
return scope
}
return f;
}
var foo = checkscope()
foo()
从上面的代码可以看到,当函数f执行时,函数checkscope的上下文其实已经被销毁了,怎么还会读取到checkscope作用域下变量的值,因为函数f执行上下文维护了一个作用域链,这个作用域链,使得函数可以读取到checkscopeContext.AO的值。这使得即使checkscope上下文即使已经销毁,但是js仍会让checkscopeContext.AO存活在内存中。闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。闭包就是函数的堆栈在函数返回后并不释放,也可以理解为这些函数堆栈并不在栈上分配,而是在堆上分配。
闭包的特性: 1.函数嵌套函数2.函数内部可以引用外部的参数和变量3.参数和变量不会被垃圾回收机制回收,除非代码中把参数和变量或者函数强制为null。 闭包的优缺点:闭包会常驻内存,会增大内存的使用量,使用不当很容易造成内存泄漏。
栈和堆
栈:栈首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。
堆:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。