开发者社区> 问答> 正文

谈谈你对闭包的认识?

展开
收起
前端问答 2019-11-24 19:50:25 1130 0
1 条回答
写回答
取消 提交回答
  • 前端问答小助手

    什么是闭包?

    闭包的定义其实很简单:函数A内部有一个函数B,函数B可以访问到函数A中的变量,那么函数B就是闭包。

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

    闭包的作用?

    闭包最大的作用就是隐藏变量,闭包的⼀大特性就是内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后,基于此特性,JavaScript可以实现私有变量、特权变量、储存变量等。

    经典面试题,循环中使用闭包解决 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)
    }
    

    在上述代码中,我们首先使用了立即执行函数将i传入函数内部,这个时候值就被固定在了参数j上面不会改变,当下次执行timer这个闭包的时候,就可以使用外部函数的变量j,从而达到目的。

    • setTimeout的第三个参数,这个参数会被当成timer函数的参数传入
    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)
    }
    
    2019-11-25 07:34:16
    赞同 1 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
为什么要学函数式编程? 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载