闭包01(closure)

104 阅读1分钟

闭包(closure)

1.有权利访问另外一个函数作用域中的变量的函数

2.函数内部变量的作用域延伸了,是一种机制。

3.明确全局变量和局部变量, 注意:局部变量一定只在函数内部使用吗?  No!

4.下面的代码,都不用es6的let。

5.闭包要用到匿名自执行函数。

理解一:

		 
    	 var a = "123";	//全局变量
         
        //一
        function fn1() {
            let a = "321";	//局部变量
            function fn2() {
                console.log(a + "--" + this.a);
            }
            return fn2();
        }
        fn1();


        //二
        function fn3() {
            let a = "321";
            function fn2() {
                console.log(a + "--" + this.a);
            }
            return fn2;
        }
        fn3()();
        
        //一和二的结果都是321--123
       	
       
        

理解二:

		let data = [];

        for (var i = 0; i < 3; i++) {
            data[i] = function () {
                console.log(i);
            };
        }

        data[0]();		//3
        data[1]();		//3
        data[2]();		//3


        for (var i = 0; i < 3; i++) {
            data[i] = (function (i) {
                return function () {
                    console.log(i);
                }
            })(i);
        }

        data[0]();		//0
        data[1]();		//1
        data[2]();		//2
        



案例一:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <title>123</title>
</head>
<body>
    <ul class="nav">
        <li>北京</li>
        <li>上海</li>
        <li>深圳</li>
    </ul>

    <script>
    
        var lis = document.querySelector('ul.nav').querySelectorAll('li');

        //思路1,动态添加属性
        for (var i = 0; i < lis.length; i++) {  
            lis[i].index = i;
            lis[i].onclick = function() {
                console.log(this.index);
            }
        }

        //思路2,闭包
        for (var i = 0; i < lis.length; i++) {  
            (function(i){
                lis[i].onclick = function() {
                console.log(i);
            }
            })(i);
        }

        //思路3,    es6,let
   
    </script>
</body>
</html>




案例二:

        //滴滴打车,3公里以内 14元,每增加1公里收5元。
        //堵车,在原来的基础上多收5元。

        //输入公里数,返回钱数
        //写法1
        function didi(n) {
            var base = 14;

            if (n > 3) {
                n = n - 3;
                base = base + n * 5;
            }

            return base;

        }

        console.log(didi(4));   //19


        //写法2
        var c = (function () {
            var base = 14;
            var sum = 0;

            return {
                normal: function (n) {
                    if(n<=3){
                        sum = base;
                    }else{
                        sum = base + (n-3)*5;
                    }

                    return sum;
                },
                yj: function (flag) {
                    return flag ? sum + 5 : sum
                }
            }

        })();

        c.normal(5);
        console.log(c.yj(true));        //29