2-9、谈谈闭包和闭包使用场景

73 阅读1分钟

什么是闭包

概念:闭包是作用域的一种特殊应用

触发闭包的情况

1、函数当做返回值被返回

2、函数当做参数被传递

3、自执行匿名函数

闭包的应用

1、隐藏变量

2、解决 for i 的问题

作用域

全局作用域、局部作用域

自由变量

不在自己作用域里的变量,就是自由变量

自由变量的值:在函数定义的地方向上层作用域查找。与函数调用位置无关

<script>
    const a = 100; //全局变量

    function fn() {
        console.log(a);//自由变量
    }

</script>

    // 情况1:函数当返回值被返回
    function fn() {
        const a = 1;
        return function () {
            console.log(a);
        };
    }
    const a = 5;
    const cb = fn();
    cb();

    // 情况2:函数当做参数传递
    function fn(cb) {
        const a = 100;
        cb();
    }

    const a = 500;
    fn(function () {
        console.log(a);
    })

    // 情况3:自执行匿名函数
    (function (index) {
        console.log(index);
    })(10);

<body>
    <button>0</button>
    <button>1</button>
    <button>2</button>
    <button>3</button>
    <button>4</button>
</body>
<script>
    const aBtn = document.getElementsByTagName("button");

    // for (var i = 0; i < aBtn.length; i++) {
    //     (function (index) {
    //         aBtn[i].onclick = function () {
    //             console.log(index);
    //         };
    //     })(i)
    // }

    for (let i = 0; i < aBtn.length; i++) {
        aBtn[i].onclick = function () {
            console.log(i);
        }
    }
</script>

<script>
    // 隐藏变量
    function fn() {
        const data = {};
        return {
            set: function (key, val) {
                data[key] = val;
            },
            get: function (val) {
                return data[val];
            },
        }
    }

    const json = fn();
    json.set("age", 18);
    console.log(json.get("age"));
</script>