JS闭包学习笔记(1):什么是闭包

闭包:当一个函数在其被声明的作用域环境外被执行时,它可以记住和使用它原本作用域中的变量。

function foo(){
    var a = 2;
    function bar(){
        console.log(a);
    }
    return bar;
}

var baz = foo();
baz(); //2

bar函数可以使用foo函数内的变量。而当最后baz函数执行时,其实是bar函数执行,bar函数很显然地在其被声明的作用域外被调用,但是最后还是输出了2.

一般可能会觉得在foo函数执行完毕后,其内部作用域会消失(根据js垃圾回收机制)。但是由于闭包的存在,foo的内部作用域还一直存在在那里,bar函数仍然对此作用域有引用,而这个引用就是闭包

因此当baz执行时(其实是bar执行),它依旧能使用它被声明时的作用域环境,因此就能使用变量a。

类似的,还有很多种将函数作为参数来传递的情况,这时函数就有可能在其他位置被执行。如:

function foo(){
    var a = 2;
    function baz(){
        console.log(a);
    }
    bar(baz);
}

function bar(fn){
    fn(); //实际调用的是foo的内部函数,为闭包
}
var fn;
function foo(){
    var a = 2;
    function baz(){
        console.log(a);
    }
    fn = baz; //把baz传递给了一个全局变量
}

function bar(){
    fn(); //实际调用的是foo的内部函数,为闭包
}

foo();
bar(); //2

不管通过什么方式将内部函数传递到外部,它都会维持对其最初被声明时的作用域环境的引用,而且不管在何处调用此函数,闭包都会被执行。

看一个例子:

function wait(message){
    setTimeout(function timer(){
        console.log(message);
    },1000);
}

wait("hello closure");

内部函数timer做为setTimeout的参数,内部函数的词法作用域包含外部wait函数的作用域,因此timer会一直保持一个对变量message的引用。

执行wait函数,当1000毫秒过去时,异步的内部函数timer利用闭包可以继续使用变量message。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值