闭包相关介绍
作用域
作用域其实就是一套规则:这个规则用于确定在特定场景下如何查找变量。任何语言都有作用域的概念,同一种语言在演进过程中也会不断完善其作用域规则。比如,在 JavaScript 中,ES6 出现之前只有函数作用域和全局作用域之分。
在 JavaScript 执行一段函数时,遇见变量读取其值,这时候会“就近”先在函数内部找该变量的声明或者赋值情况。这里涉及“变量声明方式”以及“变量提升”的知识点,我们后面会涉及到。如果在函数内无法找到该变量,就要跳出函数作用域,到更上层作用域中查找。这里的“更上层作用域”可能也是一个函数作用域,例如:
function bar() {
var b = 'bar'
function foo() {
console.log(b)
}
foo()
}
bar()
1. 块级作用域和暂时性死区
作用域概念不断演进,ES6 增加了 let 和 const 声明变量的块级作用域,使得 JavaScript 中作用域范围更加丰富。块级作用域,顾名思义,作用域范围限制在代码块中,这个概念在其他语言里也普遍存在。当然这些新特性的添加,也增加了一定的复杂度,带来了新的概念,比如暂时性死区。这里有必要稍作展开:说到暂时性死区,还需要从“变量提升”说起,参看以下代码:
函数的参数默认值设置也会受到 TDZ 的影响:
闭包相关举例
1.
2.
3.
4.
文档更新时间: 2019-06-06 13:43