闭包的认识

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>闭包</title>
</head>

<body>
    <li>零</li>
    <li>一</li>
    <li>二</li>
    <li>三</li>
    <li>四</li>
    <script>
        //jS闭包
        //概念:简单的说就是一个函数外部变量被该函数调用,这样这个函数就形成了一个闭包

        //demo1:
        // function out() {
        //     var a = 100;
        // }
        // out()
        // console.log(a);     //输出:a is not defined。
        //out()函数执行之后函数执行空间被销毁,因为此时a已经不存在了,无法被外部访问

        //demo2:
        // function out() {
        //     var a = 100;
        //     return function () {
        //         a++
        //         console.log(a);
        //     }
        // }
        // var b = out();
        // b();           //输出:101
        // b();           //输出:102   此时的a是局部变量,但是被其内部匿名函数调用,所以在out()执行之后,返回匿名函数被变量b接收
        //                //因为匿名函数调用了out函数里面的a,所以out的内存空间并没有被销毁,b每次执行a在原有基础上++

        //demo3:
        // var li = document.getElementsByTagName("li")
        // function out() {
        //     for (var i = 0; i < 5; i++) {
        //         li[i].onclick = function () {
        //             console.log(i);
        //         }
        //     }
        // }
        // out();           //输出:不管点哪个,输出都是5,li在循环的时候已经分别绑定匿名函数0-4,
        //匿名函数里面的i就是out函数的内部变量i,在out()执行完之后已经循环到5了,所以不管点哪个都是5
        //稍作修改

        //demo4:
        // var li = document.getElementsByTagName("li")
        // function out() {
        //     for (var i = 0; i < 5; i++) {
        //         li[i].onclick = (function (j) {
        //             return function () {
        //                 console.log(j);
        //             }
        //         })(i)
        //     }
        // }
        // out();             //点几输出几,li绑定了立即执行函数的返回值(也是个匿名函数),把i传入匿名函数形参j,这样
        //立即执行函数执行完之后形参j不会被销毁,而是被它的内部函数调用,所以每次点击li就能调用相应的j,返回0,1,2,3,4

        //但是let关键字可以很好的代替这个功能
        //demo5:
        // var li = document.getElementsByTagName("li")
        // function out() {
        //     for (let i = 0; i < 5; i++) {
        //         li[i].onclick = function () {
        //             console.log(i);
        //         }
        //     }
        // }
        // out();              //效果同上,点几显示几

        //总结:
        //闭包的作用:1.调用函数局部变量给外部使用
        //缺点:1.由于一个函数局部变量被其他函数调用,所以这个局部变量就会一直存在,占用较大内存
        //     2.有内存泄漏风险

        //如有错误,欢迎指正

        ***如果你知道身上肩负着多少希望,你就能面对任何事***

    </script>
</body>

</html>

 

posted @ 2020-02-29 09:16  停不下来的学习  阅读(228)  评论(0编辑  收藏  举报