预编译
预编译过程做的事,我们应该注意三点:
预编译阶段进行变量声明;
预编译阶段变量声明进行提升,但是值为 undefined;
预编译阶段所有非表达式的函数声明进行提升。
调用栈
注意 正常来讲,在函数执行完毕并出栈时,函数内局部变量在下一个垃圾回收节点会被回收,该函数对应的执行上下文将会被销毁,这也正是我们在外界无法访问函数内定义的变量的原因。也就是说,只有在函数执行时,相关函数可以访问该变量,该变量在预编译阶段进行创建,在执行阶段进行激活,在函数执行完毕后,相关上下文被销毁。
闭包
闭包的概念
函数嵌套函数时,内层函数引用了外层函数作用域下的变量,并且内层函数在全局环境下可访问,就形成了闭包。
对比前述内容,我们知道正常情况下外界是无法访问函数内部变量的,函数执行完之后,上下文即被销毁。但是在(外层)函数中,如果我们返回了另一个函数,且这个返回的函数使用了(外层)函数内的变量,外界因而便能够通过这个返回的函数获取原(外层)函数内部的变量值。这就是闭包的基本原理。
内存空间
我们知道内存空间可以分为栈空间和堆空间,其中
栈空间:由操作系统自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。
堆空间:一般由开发者分配释放,这部分空间就要考虑垃圾回收的问题。
一般情况下,基本数据类型保存在栈内存当中,引用类型保存在堆内存当中。