前端---JS

作用域--闭包

2017-06-25  本文已影响0人  死囚鸟

本文章引用《你所不知道的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() 等可以被多次调用

上一篇下一篇

猜你喜欢

热点阅读