发布于 1年前

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、闭包可以产生私有变量。

©2020 edoou.com   京ICP备16001874号-3