javascript作用域
我们知道,js中有三个作用域,分别是block scope(块作用域),function scope(函数作用域),globle scope(全局作用域);
今天我们来看看什么是嵌套函数作用域
嵌套函数作用域
let a = 10;
function outer() {
let b = 20;
function inner() {
let c = 30;
console.log(a,b,c);
}
inner();
}
outer();
// 10 20 30
我们来分析一下,在outer()函数内部定义了一个 inner()函数。在执行outer()函数的时候,会执行inner()函数,这个时候在打印a变量的时候,js引擎会在当前的函数作用域(inner函数)中查找是否有a变量,如果没有,引擎会继续在上级函数(outer函数)中查找,此时任然没有,那么就在全局作用域查找,此时有值,因此就打印出a的值,如果此时还没有值,就打印出undefined。同样的道理对于b和c都是如此。
闭包(closure)
我们先看看闭包的定义:
A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives you access to an outer function's scope from an inner function. In JavaScript, closures are created every time a function is created, at function creation time.
这个定义记住关键一点,它是在运行时产生的,一定是在函数创建时刻才有闭包
function outer() {
let counter = 0;
function inner() {
counter++;
console.log(counter);
}
inner();
}
outer();
outer();
// 1 1
function outer() {
let counter = 0;
function inner() {
counter++;
console.log(counter);
}
return inner;
}
let fn = outer();
fn();
fn();
// 1 2
理解了上面两个例子的区别,您就理解了闭包,
1、闭包一定是在函数创建时候生成的。
2、闭包可以产生私有变量。