进阶篇:闭包(18-1)

饥人谷学习进阶第 18 天

闭包的一些概念

A closure is the combination of a function and the lexical environment within which that function was declared. --MDN
一个闭包就是一个函数以及声明该函数的词法作用域的结合

闭包 = 函数 + 词法作用域

A closure is the local variables for a function - kept alive after the function has returned . --javascriptkit
闭包是函数的局部变量,在函数返回之后仍然存在

词法作用域(lexical environment)

在此重新回顾一下作用域链:

  • 函数在执行过程中,先从自己内部找变量
  • 如果找不到,再从创建当前函数的作用域(词法作用域)去找,以此往上
  • 注意找的是变量的当前的状态

那么 闭包 可以理解为:
函数连同它作用域链上的要找的那个变量 共同构成闭包

一般情况下运用闭包主要是为了

  1. 封装数据
  2. 暂存数据

典型的闭包案例:

function car(){
  var speed = 0
  function fn(){
    speed++
    console.log(speed)
  }
  return fn 
}

var speedUp = car()
speedUp()   //1
speedUp()   //2

在全局作用域下 speedUp 一直存在,即 car() 中的 fn 一直存在,所以 car() 里面的作用域就一直存在无法被销毁,因其内的 speedfn 这个函数所使用。

通过案例可以将闭包理解为:
函数(如:fn())连同它的词法作用域下使用的变量(如:speed)

闭包相关案例

var fnArr = [];
for (var i = 0; i < 10; i ++) {
  fnArr[i] =  function(){
    return i
  };
}
console.log( fnArr[3]() ) // 10

改造

// (1)
var fnArr = []
for (var i = 0; i < 10; i ++) {
  fnArr[i] =  (function(j){
    return function(){
      return j
    } 
  })(i)
}
console.log( fnArr[3]() ) // 3
// (2)
var fnArr = []
for (var i = 0; i < 10; i ++) {
  (function(i){
    fnArr[i] =  function(){
      return i
    } 
  })(i)
}
console.log( fnArr[3]() ) // 3
// (3)
var fnArr = []
for (let i = 0; i < 10; i ++) {
  fnArr[i] =  function(){
    return i
  } 
}
console.log( fnArr[3]() ) // 3

你可能感兴趣的:(进阶篇:闭包(18-1))