作用域--闭包

作者: 死囚鸟 | 来源:发表于2017-06-25 23:40 被阅读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() 等可以被多次调用

    相关文章

      网友评论

        本文标题:作用域--闭包

        本文链接:https://www.haomeiwen.com/subject/dbqdcxtx.html