javascript闭包的理解

闭包是JavaScript中的一种重要概念,它允许内部函数访问并操作外部函数的变量。当内部函数的生命周期超过外部函数时,闭包产生。作用域决定了变量在何处可见,而作用域链确保内部函数能按需查找外部作用域的变量。在给定的例子中,`mainfn`创建了一个闭包,因为`havefn`能访问`mainfn`内的`num`变量。这种机制在函数嵌套和数据封装中非常关键。
闭包的概念

1. 是一个函数,这个函数有权访问另一个作用域中的变量。

2. 另一种说法,当内部函数的生命周期大于外部函数的声明周期,而内部函数以某一种方式被外部作用域访问时,闭包就产生了。

如下闭包的代码和解释
function mainfn() {
    var num = 10;

    //写法1
    // function fun() {
    //     console.log(num);
    // }
    // return fun;

    //写法2
    return function () {
        console.log(num); // 10
    }
}
var havefn = mainfn();
havefn(); //num
我们可以拆解为几个部分

1. mainfn函数里面有内部的返回值return且就是一个函数。

2. return的这个函数内部打印了num变量。为什么能够打印num变量,原因在于作用域链的访问机制,内部函数可以访问外部函数,下面会补充作用域和作用域链的知识点。

3. 我们在外部用havefn变量接受了mainfn(),也就是接受了mainfn的返回值【内部函数,相关执行或返回值等。。。】

4. 紧接着调用havefn函数,此时也调用了mainfn里面的内部函数,所以最终能够打印变更num =10

知识点的解释:

1. 作用域:

变量在某个范围内起作用,超出了这个范围,就不起作用。这个范围就是作用域。作用域在函数的定义时就产生,而不是函数调用时产生的。

2. 作用域链:

一句话概括:根据【内部函数可以访问外部函数变量】,采用就近原则一层一层向上查找变量,这个机制就叫作作用域链。

函数A包含了函数B,那么函数B就是函数A的内部函数,

而内部函数如果要使用一个变量,首先看自己内部有没有这个变量,

如果没有,就会去紧挨着的上一级查找,【就近原则】

如果函数一层一层都找不到,最后才会去全局变量下面找。

var a = 1;
var b = 11;
function fn1() {
    var a = 2;
    var b = '22';
    fn2();
    function fn2() {
        var a = 3;
        fn3();
        function fn3() {
            var a = 4;
            console.log(a); // 4
            console.log(b); // '22'
        }
    }
}
fn1();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值