原文:A Beginner’s Guide to Understanding JavaScript Closures 链接:https://itnext.io/a-beginners-guide-to-understanding-javascript-closures-b5eb57fdbeb4 翻译:印象卡卡
闭包是JavaScript类面试中经常出现的面试题之一。 初级的开发人员通常都会害怕,但是大可不必。 就像递归一样,闭包可以被过分解读,导致看起来很复杂,但是闭包的核心再简单不过了, 我将通过写出6行来证明。
基本的闭包例子
function outside() {
let x = 2
return function inside(y) {
return x * y
}
}
简短的例子,闭包只不过是:
一个方法内部定义的一个方法,这个内部的方法使用父作用域的变量并且被暴露到外部。
这个“暴露”部分是我们使用闭包的一个重要原因。 仅通过暴露函数而不是它使用的变量,我们实质上将它们设为私有。 在我们讨论之前,让我们先看上边的例子。
详解
先看outside
,在这个函数的作用域里,做了两件事:1)定义变量x的值为2,;2)定义函数inside
并return这个函数。执行outside函数后,可以看到返回inside方法。
如果再加一个() 就会执行返回的inside函数
outside()(4)
// 8
或者这样
let myClosure = outside()
myClosure(5)
// 10
变量X呢?
变量X是闭包的关键部分,创建的变量X不能被程序的其他部分访问到,但是可以使用它。这就是闭包的作用: 它可以创建除闭包本身之外的任何函数都无法更改或访问的值。
闭包的原理就是作用域链,一个作用域里可以访问父级作用域的变量,不能访问子作用域的变量。X在inside函数的父作用域定义,所以inside被返回出来之后,就可以用inside访问x变量。
function outside() {
let x = 2
return function inside(y) {
return x * y
}
}
let myClosure = outside()
myClosure(5)
// 10
x = 4
// this is not the same 'x' variable:
myClosure(5)
// 10 // notice how it's still 10
x在outside函数里定义,所以全局作用域里不能访问到x,第10行改变的x不outside内部的不是同一个变量。
闭包其实就是这么简单:依赖作用域的原理(一个作用域内可以访问父级的作用域而不能访问子作用域)。