在 JavaScript 中,作用域(Scope) 是指变量、函数和对象在代码中的可访问性范围。
作用域决定了在代码的哪些部分可以访问特定的变量或函数,以及在哪些部分它们是不可见的。
在 JavaScript 中,作用域可以分为2种类型:
全局作用域是 JavaScript 中顶层作用域,它包含了所有全局变量和函数。
所有在全局作用域中声明的变量或函数,可以在代码的任何地方访问。
在ES6之前,局部作用域只有函数作用域一种类型。而在ES6中,新增了块级作用域。
在ES6之前,if/for等代码块里没有形成作用域,也就是说顶层作用域if/for里面使用var定义的变量会被挂在window上.
ES6之之后,在代码块使用var声明的变量、函数声明在代码块运行之后,仍能在外部被访问到,这是对低版本js的兼容,而不是作用域提升,var定义的变量仍会挂到window上
const/let 定义的变量仍然不能被外层访问到
函数作用域是函数内部的作用域,它包含了函数内部声明的变量和函数,实际上也包含了函数的形参。
块级作用域是指在 (花括号)内部声明的变量,它包含了块内部声明的变量和函数,只能在块内部访问。
变量声明前能被访问,叫作用域提升
简单地说,作用域提升是指在代码执行之前,变量和函数声明会被移动到它们的作用域的顶部-仅声明被移动,还没有初始化值。
仅var定义的变量会被提升,以及函数声明会被提升,而let/const定义的变量不会被提升。
在ES6中,let/const定义的变量在声明之前不能被访问,这种现象称为暂时性死区。
暂时性死区就是let/const没有变量提升的特性,即使变量已经存在,但是拦截掉访问权限
作用域链是JavaScript中一个非常重要的概念,它决定了变量和函数在代码中的访问顺序。
MDN 闭包 一个函数和对其周围状态(词法环境 lexical environment)的引用捆绑在一起,这样的组合成为闭包
理解的概念:
function,如果它可以访问外层作用域的自由变量,那么这个函数和周围环境就是一个闭包;如果访问了外层作用域的变量,那么它是一个闭包;详情见执行上下文