JavaScript执行上下文和执行栈
执行上下文就是JavaScript代码被解析和执行的时候所在的环境。JavaScript中全部的代码都是在执行上下文中运行的。node
执行上下文的三种类型:
- 全局执行上下文:默认的上下文,代码在运行时会建立一个全局对象,在浏览器中是window对象,this指针会指向这个全局对象。一个程序中只能存在一个全局对象。
- 函数执行上下文:每个函数在被调用的时候就会建立本身的执行上下文,每一个函数都有本身的执行上下文,只有在被调用的时候才会建立上下文。
- Eval函数执行上下文:运行在eval函数中的代码也会有上下文。
执行上下文的生命周期
-
建立阶段算法
-
执行阶段浏览器
-
回收阶段函数
-
- 建立阶段:当函数被调用可是尚未执行函数内部任何代码的时候就属于建立阶段,在建立阶段会建立变量对象,初始化函数参数,提高函数声明和变量声明。建立做用域链,做用域链的建立是在变量对象以后。肯定this关键字的指向。
-
-
- 回收阶段:执行上下文出栈等待虚拟机回收执行上下文。
变量提高和this指向的细节
- 一、变量声明提高,在JavaScript中变量能够先使用,后声明,这样并不会报错,由于在建立上下文的时候会将变量和函数的声明提早。
- 二、函数声明提高,
执行上下文栈
JavaScript代码在执行的时候会建立上下文执行栈来管理执行上下文,执行上下文栈是一种存储函数调用的栈结构,其运行过程遵循先进后出的原则。当每个函数执行的以后就会建立函数的执行上下文,而且把函数的执行上下文压入栈的顶部,当函数执行完以后,函数的上下文出栈等待垃圾回收。全局的执行上下文只有惟一的一个,当浏览器关闭的时候就会出栈被垃圾回收器回收。this
写React\Vue的项目的时候为何要在组件中写key,做用是什么?
答案:key的做用是为了在执行Diff算法的时候更快的找到对应的节点,提升Diff算法的执行效率和速度。key是给每个vnode的惟一的id,能够依靠key更快的更准确的获取到oldVnode中的节点。指针