青训营:深入理解JS
JS的基本概念
单线程动态、弱类型
面向对象、函数式
解释类语言、JT
安全、性能差
作用域:
理解:
作用域是一套规则,用于确定变量在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,那么就会使用 LHS 查询:如果目的是获取变量的值,就会使用 RHS 查询。
变量提升:
var有变量提升
let、const没有变量提升,提前访问会报错
function函数可以先调用再定义
赋值给变量的函数无法提前调用
JS是怎么执行的
引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文 ( execution context 简称EC )”,也叫执行环境。
**全局执行上下文:**代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份
**函数执行上下文:**当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
创建执行上下问的时候做了什么?
绑定This、创建词法环境、创建变量环境
-
**词法环境:**基于 ECMAScript 代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成
-
**变量环境:**变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量 (let 和 const)绑定,而后者只用来存储 var 变量绑定
-
**Outer:**指向外部变量环境的一个指针
JS的进阶知识点:
闭包:
**概念:**闭包(closure)指有权访问另一个函数作用域中变量的函数
**作用:**延伸变量的作用范围
如何调试闭包:
-
打开浏览器,按 F12 键启动 chrome 调试工具。
-
设置断点
-
找到 Scope 选项(Scope 作用域的意思)。
-
当我们重新刷新页面,会进入断点调试,按下一步直到运行到如下界面,Scope 里面会有两个参数(global 全局作用域、local 局部作用域)。
-
当执行到 fn2() 时,Scope 里面会多一个 Closure 参数 ,这就表明产生了闭包
通常,如果引用闭包的函数是一个全局变量,那么闭包会一直存在直到页面关闭;但如果这个用包以后不再使用的话,就会造成内存泄漏。
如果引用闭包的函数是个局部变量,等函数销毁后,在下次 Javascript 引擎执行垃圾回收时,判断闭包这块内容如果已经不再被使用了,那么JavaScript 引擎的垃圾回收器就会回收这块内存。
this:
调用方式的不同决定了this 的指向不同一般指向我们的调用者.
| 调用方式 | this指向 |
|---|---|
| 普通函数调用 | window |
| 构造函数调用 | 实例对象 原型对象里面的方法也指向实例对象 |
| 对象方法调用 | 该方法所属对象 |
| 事件绑定方法 | 绑定事件对象 |
| 定时器函数 | window |
| 立即执行函数 | window |