自己做的网站添加交费功能,跨境电商平台排名榜,网站后台 搜索,qt做网站服务器在深入探讨JavaScript预编译与执行机制之前#xff0c;我们首先需要明确几个基本概念#xff1a;声明提升、函数执行上下文、全局执行上下文以及调用栈。这些概念共同构成了JavaScript运行时环境的核心组成部分#xff0c;对于理解代码的执行流程至关重要。本文将围绕这些核…在深入探讨JavaScript预编译与执行机制之前我们首先需要明确几个基本概念声明提升、函数执行上下文、全局执行上下文以及调用栈。这些概念共同构成了JavaScript运行时环境的核心组成部分对于理解代码的执行流程至关重要。本文将围绕这些核心概念展开一次深度解析之旅,全面而深入地阐述这一主题。 一、声明提升Hoisting
声明提升是JavaScript中一个独特的特性它涉及到变量声明和函数声明在代码执行前被提前处理的过程。这一特性有时会引发一些令人困惑的行为尤其是对初学者而言但深入理解其机制是掌握JavaScript语言的关键之一。
1. 变量声明提升
当JavaScript引擎开始执行一段脚本或函数时它首先会进行编译阶段在这个阶段所有使用var声明的变量会被提升至当前作用域的顶部。这意味着尽管你在代码中可能将变量声明放在了函数体的下半部分实际上该变量在整个函数作用域内都是可用的尽管其初始值为undefined。
console.log(a); // undefined var a 5
在上述代码中尽管变量a的赋值操作发生在console.log之后但由于声明提升a在输出时已经被声明了只是其值为undefined。 结果与下述代码一致
var a console.log(a); // undefined var a 5 2. 函数声明提升
与变量声明类似使用函数声明语法定义的函数也会被提升至所在作用域的顶部。这意味着你可以在函数声明之前调用函数而不会遇到引用错误。 javascript
foo(); // 输出 Hello, World! function foo() { console.log(Hello, World!); } 二、函数执行上下文与全局执行上下文
在JavaScript中每当一个函数被调用时都会创建一个新的执行上下文Execution Context。执行上下文负责存储函数执行过程中的变量、函数参数以及作用域链等信息它是JavaScript执行环境的具体体现。
1. 函数执行上下文AO
当一个函数被调用时会执行以下步骤来创建其执行上下文通常称为活动对象AO, Activation Object
创建AO为函数创建一个新的执行上下文对象AO。参数和变量声明找形参和变量声明将形参和变量名作为AO的属性值为underfined初始值设为undefined。实参与形参绑定将实参和形参统一。函数声明在函数体内找函数声明将函数名作为AO的属性名值赋予函数体。
例子
function fn(a){
console.log(a);
//function a(){}
var a 123 console.log(a);
// a:123 function a(){}
//函数声明 console.log(a);
var b function (){}
//函数表达式 console.log(b);
//function b(){}
function d(){}
var da
// d:123
console.log(d); //123 } fn(1)
执行上下文AO 代码实际输出结果 2. 全局执行上下文GO
全局执行上下文是在程序启动时创建的第一个执行上下文它代表了整个JavaScript程序的执行环境。其创建过程包括
创建GO创建全局执行上下文对象 GO。变量声明在全局找变量声明变量名作为GO的属性名初始值为undefined。函数声明在全局找函数声明函数名作为GO的属性名值为函数体。
例子
var global 100 function fn(){
console.log(global);
}
fn()
执行上下文GO 代码实际输出结果 3. 全局执行上下文GO和 函数执行上下文AO
当程序运行时先进行全局变量的预编译在函数调用的前一刻进行函数声明进入函数预编译。
例子
javascript
global 100 function fn(){
console.log(global);
//undefined global 200
console.log(global); //200 global300 }
fn();
console.log(global); var global;
全局执行上下文GO和函数执行上下文AO 代码实际输出结果 三、调用栈Call Stack
调用栈是JavaScript引擎用于追踪函数调用顺序的一种数据结构它记录了每一次函数调用的状态包括函数的返回地址和局部变量等信息。每当一个函数被调用时其执行上下文会被推入调用栈当函数执行完毕其上下文则从栈顶弹出控制权返回到调用它的函数或全局作用域。
调用栈的工作机制确保了函数的执行顺序遵循“先进后出”原则同时也限制了JavaScript的并发能力因为任何时刻只能有一个执行上下文处于活动状态这解释了为什么JavaScript被称为单线程语言。