进阶篇(闭包(18-1))

饥人谷学习进阶第 18 天
闭包的一些概念
【进阶篇(闭包(18-1))】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

    推荐阅读