JS篇JavaScript-执行上下文和提升
我们通常将 JavaScript 归类为动态或解释执行语言,但实际上它也是一门编译语言,它有自己的编译器形式,运行在 JavaScript 引擎中。 每个 Web 浏览器都有自己的 JavaScript 引擎形式:Chrome 有 V8,Mozilla 有 SpiderMonkey 等。这些 JavaScript 引擎的共同点都是将 JavaScript 代码转换为编译器可以理解的语言,然后执行它。 执行上下文 Execution Context当 JavaScript 代码运行的时候,运行 JavaScript 代码的环境形成了执行上下文 ,执行上下文决定代码可以访问哪些变量、函数、对象等。 我们将执行上下文简单视为运行当前代码的 environment / scope,我们知道作用域分为 global scope 和 local scope。 类似的,执行上下文也分为不同的类型: 全局执行上下文 - 代码首次执行时候的默认环境,在代码的整个执行过程中,只用一个全局执行上下文。 函数执行上下文 - 每当执行流程进入到一个函数体内部的时候,就会创建一个函数执行上下文,可以有任意数量的函数执行上下文。 执行栈/调用栈JavaScript 是单线程的,浏览器只分配给 JavaScript 一个主线程,一次只能执行一个任务(函数),因此它在执行栈中对其他操作(事件和函数执行)形成一个任务队列,排队等候执行。 每当在浏览器中加载脚本时,栈 stack 中的第一个元素就是全局执行上下文。当有函数执行时,将创建一个函数执行上下文,并将其置于全局执行上下文之上。一旦函数执行完成,它就会从执行堆栈中弹出,并将控制权交给它下面的上下文中。结合上面说到的,我们看一个例子: var name = "global variable";console.log(name)function func1() { console.log("func1 被调用了。") func2();}function func2() { console.log("func2 被调用了。");}func1(); ...