JS基础知识-闭包

所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

闭包,看似很高大上的名字其实实质本质就是作用域应用的特殊情况:

  • 函数作为参数被传递
  • 函数作为返回值被返回

例子抬上来

  • 函数作为返回值
    function create() {
      let a = 100
      return function () {
        console.log(a)
      }
    }
    let fn = create()
    let a = 200
    fn()   // 100

当函数fn执行时在全局作用域,函数定义在create的作用域,a是自由变量,当执行返回的函数时寻找的顺序就是先在执行的作用域寻找,当前作用于找不到就像上级寻找,所以找到了a=100

  • 函数作为参数
    function print(fn) {
      let a = 200
      fn()
    }
    let a = 100
    function fn() {
      console.log(a)
    }
    print(fn) // 100

同上原理一样寻找到a为100。

总结

  1. 自由变量的查找是在函数定义的地方,向上级逐级寻找,而不是在执行的地方。

你可能感兴趣的:(JS基础知识-闭包)