闭包
- 讲闭包首选要先说说函数作用域
- 全局作用域只有一个,每个函数又都有作用域(环境)。
- 编译器运行时会将变量定义在所在作用域
- 使用变量时会从当前作用域开始向上查找变量
- 作用域就像攀亲亲一样,晚辈总是可以向上辈要些东西
- 作用域链只向上查找,找到全局 window 即终止,应该尽量不要在全局作用域中添加变量。
- 函数被执行后其环境变量将从内存中删除,但是如果子函数被使用时父级环境将被保留。
- 使用
let
/const
可以将变量声明在块作用域中(放在新的环境中,而不是全局中) - 在 for 循环中使用
let
/const
会在每一次迭代中重新生成不同的变量 - 在没有
let
/const
的历史中使用以下方式产生作用域
for (var i = 0; i < 10; i++) {
(function (i) {
setTimeout(() => {
console.log(i);
}, 500);
})(i);
}
- 闭包指子函数可以访问外部作用域变量的函数特性,即使在子函数作用域外也可以访问。如果没有闭包那么在处理事件绑定,异步请求时都会变得困难。
- JS 中的所有函数都是闭包,闭包一般在子函数本身作用域以外执行,即延伸作用域
- 闭包特性中上级作用域会为函数保存数据,从而造成的如下所示的内存泄漏问题
- 解决方法就是手动清理不需要的数据
- this 总是指向调用该函数的对象,即函数在搜索 this 时只会搜索到当前活动对象。
- 有时候函数因为是在全局环境下调用的,所以 this 指向 window,这不是我们想要的。
- 使用箭头函数解决这个问题