本文章引用《你所不知道的Javascript》其实我觉得这一章写的有点像神话,可能只是为了让初学者,后来者不那么害怕。
首先闭包的概念:
当函数可以记住并访问所在的词法作用域,即使函数函数是在当前词法作用域外执行,这时就产生了闭包
那么我们常用的场景有哪些?
(1) 循环我们常常在面试题中遇到这样的问题
for(var i =0;i<5;i++){setTimeout(function timer(){console.log(i)},1000)}
答案是:执行5次5
解释:setTimeout是作为for循环的回调,而for循环执行回调的结果为5.所以结果为5.
那么怎么解决呢
<method1> IIFE--会为每个迭代生成新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代的内部
for(var i =0;i<5;i++){(function(j){setTimeout(function timer(){console.log(j)},1000)})(i)}
<method2> 块作用域--let声明,每次循环都会重新声明
for(let i =0;i<5;i++){setTimeout(function timer(){console.log(i)},1000)}
(2)单例模式--公共一个方法
function coolModule(id){function identify(){console.log(id)} return {identify:identify}}
定义:var foo1= coolModule('11'); foo1.identify() 等可以被多次调用