Gitchat前端知识点-闭包整理

预编译

预编译过程做的事,我们应该注意三点:

预编译阶段进行变量声明;
预编译阶段变量声明进行提升,但是值为 undefined;
预编译阶段所有非表达式的函数声明进行提升。

调用栈

注意 正常来讲,在函数执行完毕并出栈时,函数内局部变量在下一个垃圾回收节点会被回收,该函数对应的执行上下文将会被销毁,这也正是我们在外界无法访问函数内定义的变量的原因。也就是说,只有在函数执行时,相关函数可以访问该变量,该变量在预编译阶段进行创建,在执行阶段进行激活,在函数执行完毕后,相关上下文被销毁。

闭包

闭包的概念

函数嵌套函数时,内层函数引用了外层函数作用域下的变量,并且内层函数在全局环境下可访问,就形成了闭包。

对比前述内容,我们知道正常情况下外界是无法访问函数内部变量的,函数执行完之后,上下文即被销毁。但是在(外层)函数中,如果我们返回了另一个函数,且这个返回的函数使用了(外层)函数内的变量,外界因而便能够通过这个返回的函数获取原(外层)函数内部的变量值。这就是闭包的基本原理。

内存空间

我们知道内存空间可以分为栈空间和堆空间,其中

栈空间:由操作系统自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。
堆空间:一般由开发者分配释放,这部分空间就要考虑垃圾回收的问题。

一般情况下,基本数据类型保存在栈内存当中,引用类型保存在堆内存当中。

猜你喜欢

转载自blog.csdn.net/weixin_39285712/article/details/90254917
今日推荐