深入理解JS学习笔记

76 阅读2分钟

JS的基本概念

诞生

  • 借鉴C语言的基本语法;
  • 借鉴Java语言的数据类型和内存管理;
  • 借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;
  • 借鉴Self语言,使用基于原型(prototype)的继承机制。

01

graph TD
Browser进程 --> GPU进程 --> 渲染进程--> 插件进程网络进程

渲染进程包括

graph TD
GUI进程 --> JS进程--> 事件触发函数--> 定时器触发线程-->网络线程

js语言特点

  • 单线程
  • 动态、弱类型
  • 面向对象、函数式
  • 解释类语言、JIT
  • 安全、性能差

作用域

  1. 全局作用域
  2. 函数作用域
  3. 块级作用域

变量提升

  • 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 的值将保持为闭合词法上下文的值)。

垃圾回收