JavaScript知识 - 闭包
JavaScript资料整理
闭包
闭包的定义很简单:函数 A 返回了一个函数 B,并且函数 B 中使用了函数 A 的变量,函数 B 就被称为闭包。
function A() { |
你是否会疑惑,为什么函数
A
已经弹出调用栈了,为什么函数B
还能引用到函数A
中的变量。因为函数A
中的变量这时候是存储在堆上的。现在的JS
引擎可以通过逃逸分析辨别出哪些变量需要存储在堆上,哪些需要存储在栈上。
经典面试题,循环中使用闭包解决 var 定义函数的问题
for ( var i=1; i<=5; i++) { |
- 首先因为
setTimeout
是个异步函数,所有会先把循环全部执行完毕,这时候i
就是6
了,所以会输出一堆6
。 - 解决办法两种,第一种使用闭包
for (var i = 1; i <= 5; i++) { |
- 第二种就是使用
setTimeout
的第三个参数
for ( var i=1; i<=5; i++) { |
第三种就是使用
let
定义i
了
for ( let i=1; i<=5; i++) { |
因为对于
let
来说,他会创建一个块级作用域,相当于
{ // 形成块级作用域 |