预解释的机制:带var的关键字和function关键字都会进行预解释
预解释:(一种毫不节操的机制)在JS代码之前,首先找到所有带var关键字和function关键字的,提前声明(declare)或者定义(defined)
- var:在代码执行之前只是先声明(默认值是Undefined)然后代码才开始从上向执行定义赋值这一步
- function:在代码执行之前把声明个定义两部分都完成了,代码执行的过程中遇到function不再重复定义,只有遇到执行函数的代码,才执行
预解释7步骤:
- 不管条件是否成立,都进行预解释
- 预解释只发生在=左边,=右边的不预解释
- 匿名函数闭包常用的方式不进行预解释
- 函数中return后面的代码不执行,但预解释,return返回的值不预解释
- 对于重名的不重复声明,但是重复定义
- 预解释只发生在同一个脚本块中
- 预解释发生在当前作用域下
作用域:(函数周期)
从window下的预解释开始,声明加定义了一个函数(引用数据类型,所以首先开一个堆内存,把函数中的代码当做字符串存储起来)代码从上到下执行,执行我们的函数,形成了一个私有所用于,在私有作用域中从新的预解释,然后私有作用域下代码执行,还是同样的步骤,–》但是当我们完成返回一个地址(返回一个函数或者是一个对象)并且在外面被其他的东西占用这个地址(var 变量=地址或者元素的绑定事件等于这个地址)这种情况下,新形成的作用域就不销毁,如果外面没有占用,那就不立即销毁。
栈内存:1、用来运行代码的。2、用来存储基本数据类型值的
堆内存:1、用来存储引用数据类型的