👸🏾 写在前面:对于初学者,全局执行上下文,全局作用域,函数执行上下文,函数作用域,这几个很容易混。关于执行上下文|作用域|闭包|变量提升|块级作用域这些内容有着很强的关联性,所以我把它们放在一起来复习整理。但一时间有不知该从哪里入手去解释,最近翻看了一些前辈的文章有了大概的思路。
思维导图:先把涉及的所有知识点罗列出来,再根据知识点的范围与联系进行分类,梳理出一张思维导图,最后对细节内容分篇整理总结。可以根据目录单独食用👍🏾
接下来我会从执行上下文开始,理解执行上下文和执行栈对于理解其他 JavaScript 概念(如变量声明提升,作用域和闭包)至关重要。
目录
一、执行上下文定义:
定义:js引擎在js代码正式执行之前会先创建执行环境,在执行环境中做预处理工作,即,代码执行的环境。(纯语义理解,上下文可不就是环境的意思)还有执行上下文对象,执行上下文栈,这两个名词接下来👇也会解释。
二、执行上下文对象分类:
-
全局执行上下文(对象),默认的,在浏览器中是 window 对象,并且 this 在非严格模式下指向它。
-
函数执行上下文,JS 的函数每当被调用时创建一个上下文(对象)。只有遇到调用函数时,函数执行上下文才会被创建。
-
Eval 执行上下文(对象),eval 函数会产生自己的上下文,这里不讨论。(实际开发中很少使用,所以见到的情况不多)
//1.全局的执行上下文
var a = 10;
var bar = function(x){ //2.创建bar的执行上下文
var b=5;
foo(x+b);
}
var foo = function(y){ //3.创建foo的执行上下文
var c=5;
console.log(a+c+y);
}