原文:A Beginner’s Guide to Understanding JavaScript Closures 链接:https://itnext.io/a-beginners-guide-to-understanding-javascript-closures-b5eb57fdbeb4 翻译:印象卡卡

1_AJWhia2_QH77RYEWhsLsWA.jpeg

闭包是JavaScript类面试中经常出现的面试题之一。 初级的开发人员通常都会害怕,但是大可不必。 就像递归一样,闭包可以被过分解读,导致看起来很复杂,但是闭包的核心再简单不过了, 我将通过写出6行来证明。

基本的闭包例子

  1. function outside() {
  2. let x = 2
  3. return function inside(y) {
  4. return x * y
  5. }
  6. }

简短的例子,闭包只不过是:

一个方法内部定义的一个方法,这个内部的方法使用父作用域的变量并且被暴露到外部。

这个“暴露”部分是我们使用闭包的一个重要原因。 仅通过暴露函数而不是它使用的变量,我们实质上将它们设为私有。 在我们讨论之前,让我们先看上边的例子。

详解

先看outside,在这个函数的作用域里,做了两件事:1)定义变量x的值为2,;2)定义函数inside并return这个函数。执行outside函数后,可以看到返回inside方法。

豆芽图片20190222185326.png

如果再加一个() 就会执行返回的inside函数

  1. outside()(4)
  2. // 8

或者这样

  1. let myClosure = outside()
  2. myClosure(5)
  3. // 10

变量X呢?

变量X是闭包的关键部分,创建的变量X不能被程序的其他部分访问到,但是可以使用它。这就是闭包的作用: 它可以创建除闭包本身之外的任何函数都无法更改或访问的值。
闭包的原理就是作用域链,一个作用域里可以访问父级作用域的变量,不能访问子作用域的变量。X在inside函数的父作用域定义,所以inside被返回出来之后,就可以用inside访问x变量。

  1. function outside() {
  2. let x = 2
  3. return function inside(y) {
  4. return x * y
  5. }
  6. }
  7. let myClosure = outside()
  8. myClosure(5)
  9. // 10
  10. x = 4
  11. // this is not the same 'x' variable:
  12. myClosure(5)
  13. // 10 // notice how it's still 10

x在outside函数里定义,所以全局作用域里不能访问到x,第10行改变的x不outside内部的不是同一个变量。
闭包其实就是这么简单:依赖作用域的原理(一个作用域内可以访问父级的作用域而不能访问子作用域)。