82 - 《JavaScript 基础(上):作用域、闭包、Hoist、this 关键字》
发布于 2022年3月24日
复习下基础知识,温故知新。
🐍 作用域
作用域决定执行代码时的上下文,包括可以访问哪些变量、函数、对象等。通常大家会接触到的有全局作用域、函数作用域、块级作用域、词法作用域、作用域链。
全局作用域只有一个,就是定义在最外面的那个。
函数会创建新的作用域,即函数作用域,每次执行函数,都会创建新的作用域。函数作用域会在函数执行时被绑定到函数执行时的上下文。函数作用域里的变量只能在函数体内被访问到。
if、switch、while、for 等语句会创建块级作用域。那块级作用域里的变量能在外部被访问吗?这要看是用 var 还是 let/const 了。var 是函数作用域级,而 let 和 const 是块级作用域级。
JavaScirpt 处理作用域的方式是词法作用域,也叫静态作用域,与之相对的是动态作用域,很少语言用,比如 Bash 就是动态作用域。词法作用域决定了作用域在代码被 JavaScript 引擎编译时即会决定,而不是在代码被运行时决定。
最后,作用域链是什么?执行上下文会为每个词法环境创建指向父作用域的引用,所以往里的作用域就能访问往外的作用域,而外面的不能访问里面的。
🐹 闭包
理解了作用域,闭包就很好理解了。闭包是指嵌套函数里,子函数能访问父函数的作用域,就算父函数已经完成执行。原因是子函数的执行上下文创建了指向父函数作用域的引用,所以子函数没结束,引用一直存在,父函数的作用域就一直存在。
🐢 Hoist
作用域内的变量和函数会在编译阶段被放到内存里的过程叫 Hoist。有个误解是大家认为 Hoist 是把他们提到作用域的前