你应该知道的执行上下文、调用栈、闭包、this、作用域之间的关系

这是我参与更文挑战的第5天,活动详情查看: 更文挑战

首先,JavaScript的执行上下文只有两种,分为:全局执行上下文函数执行上下文。(由于eval执行上下文一般不会使用,这里不做讨论)。

全局执行上下文只有一个,而函数执行上下文在每次执行函数时候都会创建一个新的函数执行上下文。

执行上下文强调在于执行,只有被执行了,才会生成执行上下文

执行上下文生命周期

执行上下文生命周期为:创建阶段执行阶段回收阶段

创建阶段

  1. 变量环境(VariableEnvironment)和词法环境(LexicalEnvironment)被定义。

    变量环境:通过var声明的变量存在这里

    词法环境:通过letconstwith()try-catchfunction声明的变量存在这里。

    词法环境是一种规范类型(specification type),它定义了标识符和ECMAScript代码中的特定变量及函数之间的联系。

    变量环境永远不变,而词法环境有可能改变。

  2. 确定this的指向(所以说this是要到执行阶段才能确定的)

  3. 建立作用域链

20200417172742484.png
执行阶段:变量赋值、函数的引用。

20200417172834273.png

这么多执行上下文,如何管理这些上下文?这就需要到 执行上下文栈了。

这个用来管理执行上下文的栈就被称为调用栈。

可以认为执行栈底部永远有个全局执行上下文,除非把程序停了或者把浏览器关了,否则执行栈底部部永远有个全局执行上下文。
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9kWmp6TDNjWkxHWjVrZXVjemR4TmJKaEdPa0FVVWljUWxXT0k3WHhYbGlhQ1RGNldpYXFiZ2RZOGZuUVI1QURBV3YyNVltaWJRQm9XSFVyUGVIMFhmbWM0ZUEvNjQw.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享