JS使用作用域链理解闭包

240 阅读1分钟

闭包

  1. 概念

    有权访问另外一个函数作用域中变量的函数

  2. 例子

    function books() {
        var books = "书包里面的书本";
        return function() {
            console.log(books);
        }
    }
    var bag = books();
    bag();
    
    1. 一开始,js解析器预解析,创建一个全局执行环境,该环境的作用作用链属性指向作用域链数组,该数组的第一个元素指向全局变量对象,里面包含还没赋值的变量和函数名,函数变量名;如果是一个函数,将会创建一个函数执行环境,该执行环境的也有一个作用域链

    2. 执行books()函数之前,将会创建一个books函数变量对象,同时将该变量对象排在作用域链数组的最前(匿名函数执行环境的作用域链接继承它创建时所在执行环境的作用域链)

    3. 执行匿名函数之前,创建一个匿名函数变量对象,同时将该变量对象排在匿名函数作用域链数组的最前

    4. 执行完books()函数后,books/bag函数的作用域链会被销毁,books/bag函数的变量对象在存在匿名函数作用域链的指引情况下,而没有被销毁(即匿名函数可以访问bag函数作用域中变量,所以该匿名函数是闭包)