1.什么是闭包
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
2.词法作用域
function init() {
var name = "Mozilla"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
displayName();
}
init();
这里在init()函数内部声明了变量name,但是在displayName()函数内部并没有声明name,但是可以把init()内部声明的name看坐是displayName()函数的全局变量。所以displayName()可以访问到父函数init()内部声明的变量。
3.闭包
function init() {
var name = "Mozilla"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
return displayName();
}
let fn = init()
fn()
这段代码和第一个init()函数实例完全一样。其中不同的地方就是第二个函数在displayName()执行前,就会从函数内部返回。