重识闭包
三月 08, 2021
本文共计:
561 字
预计阅读时长:
2分钟
前言
为什么再次选择重温闭包
这个神奇的物种呢?可能是脑海里还存在以前的疑虑
吧?
函数就是闭包,这是最暴力的解释,也是最直观的解释,因为在全局作用域下,函数引用了函数作用域外的变量,像
DOM
引用;
函数内的函数引用了函数内部的变量或者函数外部的变量,闭包由此生成;(也是目前我能接受的理解,包含《你不知道的JavaScript中》所解释的,回调皆闭包);
切题引入
完成一个for循环,依次打印1-10,要求每隔一秒打印;
方案一
1 | // 记录setTimeout堆栈 |
方案二
1 | for (let i = 0; i<10; i ++) { |
方案三
1 |
|
方案一主要利用了闭包
的特性;方案二主要利用了ES6``let
模块作用域的特性,for循环每次都保留上一次的值开始循环;方案三主要利用了async
异步同步化;
函数的生命周期
图解
1 | // 记录setTimeout堆栈 |
每次执行完一次for
循环之后,蓝色的线条都会断开,作为函数生命周期的结束标志
,但是内部函数还是会保留上次AO
对象,且闭包作用域是内部的无名
函数。
利用外围timerQueue
对象保存定时器引用,适时清空,优化内存占用。
查看评论