• JavaScript中的闭包


    闭包

    涉及面试题:什么是闭包?

    闭包的概念:

    当一个内部函数被调用的时候,这个内部函数可以访问外部函数中的变量,此时就形成了闭包

    闭包的作用:

    局部变量无法共享且长期有效保存,全局变量又容易造成变量的污染。闭包可以长久保存变量并且防止全局变量的污染

    闭包的特点:

    (闭包会声明私有变量,私有变量会常驻内存)占用更多的内存,不容易被释放,容易造成内存泄露

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

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

    很多人对于闭包的解释可能是函数嵌套了函数,然后返回一个函数。其实这个解释是不完整的,就比如我上面这个例子就可以反驳这个观点。

    在 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)
    }

    在上述代码中,我们首先使用了立即执行函数将 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)
    }
  • 相关阅读:
    java基础-基本的输入与输出
    Java基础-位运算符Bitwise Operators
    Java基础-字符串连接运算符String link operator
    Java基础-赋值运算符Assignment Operators与条件运算符Condition Operators
    Java基础-逻辑运算符Logic Operators
    Java基础-比较运算符Compare Operators
    Java基础-算术运算符(Arithmetic Operators)
    NGUI裁剪模型和粒子
    编辑器插件数据保存之Serializable
    using语法糖
  • 原文地址:https://www.cnblogs.com/keyng/p/12930768.html
Copyright © 2020-2023  润新知