2022-10-12 02:32:11
JavaScript(JS)文件通过浏览器加载并执行,其运行过程包括加载文件、创建执行上下文、解析与执行代码、销毁上下文及更新DOM等步骤。具体运行原理及步骤如下:
1. 加载JS文件示例:<script src="example.js"></script>会请求并加载example.js文件。
同步加载:默认情况下,浏览器会阻塞HTML解析,直到JS文件加载并执行完毕(可能导致页面渲染延迟)。
异步加载:通过async或defer属性优化加载行为:
async:文件加载完成后立即执行,不阻塞HTML解析,但执行顺序不确定。
defer:文件加载完成后在DOM解析完成后、DOMContentLoaded事件前按顺序执行。
全局对象:如浏览器中的window对象,包含全局变量、函数和DOM方法。
变量环境:存储全局变量(如var声明的变量)和函数声明。
词法环境:处理块级作用域(如let/const声明的变量)。
变量提升:函数声明和var变量会被提升到当前执行上下文的顶部(函数声明优先于变量)。
语法检查:浏览器检查代码是否存在语法错误(如缺少括号、未闭合的字符串等)。
变量赋值:遇到变量赋值时,在执行上下文中创建或更新变量。
函数调用:遇到函数调用时,跳转到函数定义处执行。
参数与局部变量:存储函数参数和let/const声明的局部变量。
作用域链:链接到外层执行上下文(如全局上下文或其他函数上下文),用于变量查找。
在全局或函数执行上下文中,按顺序执行代码逻辑(如算术运算、条件判断、循环等)。
遇到嵌套函数调用时,会递归创建新的函数执行上下文。
通过构造函数(如new Object())或字面量(如{})创建对象,存储在执行上下文中。
示例:const obj = { name: "Alice" }; // 对象存储在全局或函数上下文中
局部变量和函数参数会被清除,释放内存。
闭包会保留外层函数的变量引用,防止其被销毁。
修改元素属性(如style、className)。
添加/删除元素(如appendChild()、removeChild())。
绑定事件监听器(如addEventListener())。
通过以上步骤,JS文件在浏览器中完成加载、解析、执行和交互,实现动态网页功能。