初步认识闭包

323 阅读1分钟

什么是闭包?

  • 首先我们可以通过一段代码清晰地展示所谓的闭包
function foo() {
    var a = 2;
    function bar() {
        console.log( a );
    }
    return bar;
}
var baz = foo();
baz();  // 2 

在foo()执行后,其返回值(也就是内部的bar()函数)赋值给变量baz并调用baz(),实际上只是通过不同的标识符引用调用了内部的函数bar(),即bar()虽然可以被正常执行,但是在其自身词法作用域以外的地方被调用了 ** 在foo()执行后,其内部作用域理应被销毁,用以释放不再使用的内存空间,但是由于bar()函数仍然持有对该作用域的引用,使得内部作用域没有被销毁,而这个引用就叫做闭包 **

闭包终极形态(强化理解)

    function test() {
        var arr = []
        for(var i = 0; i<10; i++){
            (function(j) {
                arr[j] = function() {
                    console.log(j);
                }
            })(i)
        }
        return arr
    }
    var myArr = test()
    
    for(var j = 0;j < 10; j++) {
        myArr[j]()
    }

在这段代码中,首先是执行一个对于“i”的for循环然后就是一直到i为10,然后就是一直把i的值付给j,不过到i为9的时候,就会终止循环,不过此时i已经为10,但j还是为9,因为数组function(j)一直在调用test()的词法作用域,所以就产生了闭包,所以最后把test()对象付给数组myArr是,每次都是输出function(i)循环是,i的值,即0,1,2,3,4,5,6,7,8,9没错就是这样