闭包实例&解释

下面是它的工做原理。每当声明一个新函数并将其赋值给变量时,其实是保存了函数定义和闭包。闭包包含了建立函数时声明的全部变量,就像一个背包同样——函数定义附带一个小背包。这个背包保存了建立函数时声明的全部变量。php

因此咱们上面的解释都是错误的,让咱们再试一次,但此次是正确的:闭包

function createCounter() {
  let counter = 0
  const myFunction = function() {
    counter = counter + 1
    return counter
  }
  return myFunction
}
const increment = createCounter()
const c1 = increment()
const c2 = increment()
const c3 = increment()
console.log('example increment', c1, c2, c3)

  

  1. 第 1-8 行,咱们在全局执行上下文中建立了一个新变量 createCounter,它包含了一个函数定义,与上面相同。函数

  2. 第 9 行,咱们在全局执行上下文中声明一个名为 increment 的新变量,与上面相同。spa

  3. 第 9 行,咱们调用 createCounter 函数并将其返回值赋给 increment 变量,与上面相同。设计

  4. 第 1-8 行,调用函数,建立新的本地执行上下文,与上面相同。blog

  5. 第 2 行,在本地执行上下文中声明一个名为 counter 的新变量,并赋值为 0,与上面相同。接口

  6. 第 3-6 行,在本地执行上下文中声明名为 myFunction 的新变量。变量的内容是另外一个函数的定义,即第 4 行和第 5 行所定义的内容。咱们还建立了一个闭包并将其做为函数定义的一部分,闭包含包含函数做用域内的变量,在本例中为变量 counter(值为 0)。资源

  7. 第 7 行,返回 myFunction 变量的内容,删除本地执行上下文。myFunction 和 counter 再也不存在,控制权返回到调用上下文。因此咱们返回函数定义及其闭包,闭包中包含建立函数时声明的变量。作用域

  8. 第 9 行,在调用上下文(全局执行上下文)中,createCounter 返回的值被赋给 increment。变量 increment 如今包含一个函数定义(和闭包),其中函数定义由 createCounter 返回。它再也不被标记为 myFunction,但定义是同样的。在全局上下文中,它被称为 increment。rem

  9. 第 10 行,声明一个新变量(c1)。

  10. 第 10 行,查找变量 increment,它是一个函数,调用它,它包含以前返回的函数定义,也就是第 4-5 行所定义的内容(还有一个带变量的闭包)。

  11. 建立新的执行上下文,没有参数,开始执行这个函数。

  12. 第 4 行,counter = counter + 1。咱们须要查找变量 counter。在查看本地或全局执行上下文以前,先让咱们来看看闭包。请注意,闭包包含一个名为 counter 的变量,其值为 0。在第 4 行的表达式以后,它的值被设置为 1,而后再次保存在闭包中。闭包如今包含了值为 1 的变量 counter。

  13. 第 5 行,咱们返回 counter 的值或数值 1,销毁本地执行上下文。

  14. 返回第 10 行,返回值(1)被分配给 c1。

  15. 第 11 行,咱们重复步骤 10-14。此次,咱们能够看到变量 counter 的值为 1,这个值是在第 4 行代码中设置的。它的值加 1,并在 increment 函数的闭包中存为 2。c2 被赋值为 2。

  16. 第 12 行,咱们重复步骤 10-14,c3 被设为 3。

  17. 第 13 行,咱们记录变量 c一、c2 和 c3 的内容。

因此如今咱们了解闭包的工做原理。当声明一个函数时,它包含一个函数定义和一个闭包。闭包是函数建立时声明的变量的集合。

你可能会问,任何函数是否都有闭包,包括在全局范围内建立的函数?答案是确定的。在全局范围中建立的函数也会建立一个闭包。但因为这些函数是在全局范围内建立的,所以它们能够访问全局范围内的全部变量,就无所谓闭包不闭包了。

当一个函数返回另外一个函数时,才会真正涉及闭包。返回的函数能够访问仅存在于其闭包中的变量。

 

 结  论 

我经过背包类比的方式记住了闭包。当建立和传递一个函数或将其从另外一个函数返回时,这个函数就带有一个背包,背包中包含了全部在建立函数时声明的变量。

 

存在的意义:

闭包就是一种语法糖,它以很天然的形式,把咱们的目的和咱们的目的所涉及的资源全给自动打包在一块儿,以某种天然、尽可能不让人误解的方式让人来使用。至于其具体实现,我我的意见,在不影响使用的状况下,不求甚解便可。在不少状况下,须要在一段代码里去访问外部的局部变量,不提供这种语法糖,须要写很是多的代码,有了闭包这个语法糖,就不用写这么多代码,天然而然的就用了。

 

闭包是从用户角度考虑的一种设计概念,它基于对上下文的分析,把龌龊的事情、复杂的事情和外部环境交互的事情都本身作了,留给用户一个很天然的接口。

相关文章
相关标签/搜索