JS的基本概念
诞生
- 借鉴C语言的基本语法;
- 借鉴Java语言的数据类型和内存管理;
- 借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;
- 借鉴Self语言,使用基于原型(prototype)的继承机制。
01
graph TD
Browser进程 --> GPU进程 --> 渲染进程--> 插件进程网络进程
渲染进程包括
graph TD
GUI进程 --> JS进程--> 事件触发函数--> 定时器触发线程-->网络线程
js语言特点
- 单线程
- 动态、弱类型
- 面向对象、函数式
- 解释类语言、JIT
- 安全、性能差
作用域
- 全局作用域
- 函数作用域
- 块级作用域
变量提升
- var有变量提升
- let、const没有变量提升,提前访问会报错
- function函数可以先调用再定义
- 赋值给变量的函数无法提前调用
JS的执行
在传统编译语言的流程中,程序中的一段源代码在执行之前会经历一系列步骤,统称为“编译”。
常见编译型语言(例如:Java)来说,编译步骤分为:词法分析->语法分析->语义检查->代码优化和字节码生成。
对于解释型语言(例如 JavaScript)来说,通过词法分析 -> 语法分析 -> 语法树,生成 AST 之后,就开始一边解释,一边执行。
在JavaScript的执行过程主要有以下几个关键角色:
-
引擎:从头到尾负责整个JavaScript程序的编译及执行过程;
-
编译器:负责语法分析以及代码生成等;
-
作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。作用域本质上就是程序存储和访问变量的规则。
JS的进阶知识点
闭包
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。
this
与其他语言相比,函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别。
在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定)。this 不能在执行期间被赋值,并且在每次函数被调用时 this 的值也可能会不同。ES5 引入了 bind 方法来设置函数的 this 值,而不用考虑函数如何被调用的。ES2015 引入了箭头函数,箭头函数不提供自身的 this 绑定(this 的值将保持为闭合词法上下文的值)。