JavaScript 在单线程环境中运行,意味着它一次只能执行一个任务。它通过执行上下文(EC)来处理代码的执行,这些执行上下文可以是全局执行上下文(GEC)或函数执行上下文(FEC)。
全局执行上下文(GEC)
-
在加载代码文件时创建。
-
全局执行上下文(GEC)负责设置全局对象(在浏览器中是 window)和 (
this
) 关键字。 - 全局作用域中声明的所有变量和函数都存储在全局执行上下文中。
执行上下文阶段
-
内存创建阶段:
在内存创建阶段,JavaScript 为变量和函数分配内存。
变量最初被赋值为 undefined,而函数则会连同其完整定义一起存储在内存中。 - 执行阶段:
内存分配阶段完成后,JavaScript 开始逐行执行代码。
变量被赋予实际值,函数被执行。
函数执行上下文(FEC)
-
每当调用一个函数时,JavaScript 会为该函数创建一个新的执行上下文。
-
每个函数的执行上下文分为两个阶段:
-
内存阶段:为函数内的局部变量和函数分配内存。
-
执行阶段:执行函数体,变量获得实际值。
- 执行完成后,函数的执行上下文被销毁,释放了内存。
返回语句
一旦函数遇到返回语句,函数会立即退出,并且其执行上下文将从调用栈中移除。任何写在返回语句之后的代码都不会被执行。
调用栈
JavaScript 使用调用栈来管理执行上下文。
-
使用后进先出(LIFO)的概念:
-
当调用一个函数时,它的执行上下文会被放到栈顶。
- 一旦函数完成(或达到 return 语句),其执行上下文就会从调用栈中移除。
JavaScript 是单线程的
单线程意味着JavaScript一次只能执行一个操作,但它仍然可以执行异步操作,这不是很有趣吗?在我的下一篇文章中,我们将讨论JavaScript这一神奇的功能。