闭包
某个表达式(通常指函数)可以在其词法作用域外执行时访问其词法作用域
形成原因
function A(){
var a = 1
function B(){
console.log(a)
}
return B
}
A()()
嵌套函数A包含B,B被通过某种方式(比如值传递)转移到词法作用域A()之外,当函数A执行完成之后,按常理来说当前作用域A应该被释放,但是,因为B使用了A()中的变量a,而且B没有被释放调,B可能会用到变量a,因为变量a有被引用次数,所以a不被释放。
闭包应用
我一直把闭包当作一种特性,当我需要一个封闭的,可长期存在的环境(作用域)的时候,可以考虑构造闭包环境来实现。
let构造闭包环境
for(let i = 0;i < 10; i++) {
setTimeout(function timer(){
console.log(i)
})
}
函数包裹形成闭包环境
for(var i = 0;i < 10; i++) {
(function(i) {
setTimeout(function timer(){
console.log(i)
})
})(i)
}
同时可以发现,使用IIFE可以模拟块级作用域哦