JS引擎的一些事
JS引擎
- 一个读取代码并运行的引擎,没有单一的"JS引擎";
- 每个浏览器都有自己的引擎,流行的引擎项目:
- V8 (opens new window) 开源,由 Google 开发,用 C ++ 编写
- Rhino (opens new window) 由 Mozilla 基金会管理,开源,完全用 Java 开发
- SpiderMonkey (opens new window) 第一个支持 Netscape Navigator 的 JavaScript 引擎,目前正供 Firefox 使用
- JavaScriptCore (opens new window) 开源,以Nitro形式销售,由苹果为Safari开发
- KJS (opens new window) KDE的引擎,最初由 Harri Porten 为 KDE 项目中的 Konqueror 网页浏览器开发
- Chakra(JScript9) (opens new window) Internet Explorer
- Chakra(JavaScript) (opens new window) Microsoft Edge
- Nashorn (opens new window) OpenJDK 的一部分,由 Oracle Java 语言和工具组编写
- JerryScript (opens new window) 物联网的轻量级引擎
作用域
- 可以从中访问变量的"区域"
词法作用域
- 在词法阶段的作用域,换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变
块作用域
- 由花括号{}创建的范围
作用域链
- 函数可以上升到它的外部环境(词法上)来搜索一个变量,它可以一直向上查找,直到它到达全局作用域
同步
- 一次执行一件事, “同步”引擎一次只执行一行,JavaScript是同步的
异步
- 同时做多个事,JS通过浏览器API模拟异步行为
事件循环(Event Loop)
- 浏览器API完成函数调用的过程,将回调函数推送到回调队列(callback queue),然后当堆栈为空时,它将回调函数推送到调用堆栈
堆栈
- 一种数据结构,只能将元素推入并弹出顶部元素。 想想堆叠一个字形的塔楼; 你不能删除中间块,后进先出
堆
- 变量存储在内存中
调用堆栈
- 函数调用的队列,它实现了堆栈数据类型,这意味着一次可以运行一个函数。 调用函数将其推入堆栈并从函数返回将其弹出堆栈
执行上下文
- 当函数放入到调用堆栈时由JS创建的环境
- 当在另一个函数内创建一个函数时,它“记住”它在以后调用时创建的环境
垃圾收集
- 当内存中的变量被自动删除时,因为它不再使用,引擎要处理掉它
变量的提升
- 当变量内存没有赋值时会被提升到全局的顶部并设置为undefined
this
- 由JavaScript为每个新的执行上下文自动创建的变量/关键字