JS中闭包的概念

1. 闭包概念

function foo() {
    var a = 2; //let a = 2;

    function bar() {
        console.log( a );
    }

    return bar;
}

var baz = foo();

baz(); // 2 -- 哇噢,看到闭包了,伙计。

bar() 依然拥有对那个作用域的引用,而这个引用称为闭包

无论我们使用什么方法将内部函数 传送 到它的词法作用域之外,它都将维护一个指向它最开始被声明时的作用域的引用,而且无论我们什么时候执行它,这个闭包就会被行使

2. 一个很好的例子

不使用闭包

for (var i=1; i<=5; i++) {
    setTimeout( function timer(){
         console.log( i );
    }, i*1000 );
}
//6,6,6,6,6

使用闭包

for (var i=1; i<=5; i++) {
    (function(){
        var j = i;
        setTimeout( function timer(){
            console.log( j );
        }, j*1000 );
    })();
}
//1,2,3,4,5

3. 重温块儿作用域

for (var i=1; i<=5; i++) {
    let j = i; // 呀,给闭包的块儿作用域!
    setTimeout( function timer(){
        console.log( j );
    }, j*1000 );
}
//1,2,3,4,5
for (let i=1; i<=5; i++) {
    setTimeout( function timer(){
        console.log( i );
    }, i*1000 );
}
//1,2,3,4,5

以上参考《你不知道的JS》,代码结果已经经过验证。

总结:从以上示例来看:

  • 函数内可形成一个封闭的作用域,外部不可访问;同时形成闭包,无论函数在何处被调用,它都将维护一个指向它最开始被声明时的作用域的引用
  • let 关键字将变量声明附着在它所在的任何块儿(通常是一个 { .. })的作用域中,这个块作用域外部不可访问。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容