美文网首页
2019-06-05 闭包

2019-06-05 闭包

作者: Simon_s | 来源:发表于2019-06-05 11:49 被阅读0次

    闭包

    定义:闭包的定义很简单:函数 A 返回了一个函数 B,并且函数 B 中使用了函数 A 的变量,函数 B 就被称为闭包。

    function A() {
      let a = 1
      function B() {
          console.log(a)
      }
      return B
    }
    

    你是否会疑惑,为什么函数 A 已经弹出调用栈了,为什么函数 B 还能引用到函数 A 中的变量。因为函数 A 中的变量这时候是存储在堆上的。现在的 JS 引擎可以通过逃逸分析辨别出哪些变量需要存储在堆上,哪些需要存储在栈上。

    经典面试题

    循环中使用闭包解决 var 定义函数的问题

    for ( var i=1; i<=5; i++) {
        setTimeout( function timer() {
            console.log( i );
        }, i*1000 );
    }
    

    注释:首先因为 setTimeout 是个异步函数,所有会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6。

    解决办法① -- 使用闭包

    for (var i = 1; i <= 5; i++) {
      (function(j) {
        setTimeout(function timer() {
          console.log(j);
        }, j * 1000);
      })(i);
    }
    

    解决办法② -- setTimeout 第三个参数

    for ( var i=1; i<=5; i++) {
        setTimeout( function timer(j) {
            console.log( j );
        }, i*1000, i);
    }
    

    解决办法③ -- 使用 let 定义 i

    for ( let i=1; i<=5; i++) {
        setTimeout( function timer() {
            console.log( i );
        }, i*1000 );
    }
    

    关于 let 的实现方式

    { // 形成块级作用域
      let i = 0
      {
        let ii = i
        setTimeout( function timer() {
            console.log( ii );
        }, i*1000 );
      }
      i++
      {
        let ii = i
      }
      i++
      {
        let ii = i
      }
      ...
    }
    

    关于闭包 😊😊😊😊😊😊😊😊😊😊😊😊😊😊 0.0

    相关文章

      网友评论

          本文标题:2019-06-05 闭包

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