美文网首页
作用域、立即执行函数、闭包

作用域、立即执行函数、闭包

作者: gzlfight | 来源:发表于2018-07-03 15:30 被阅读0次

一、作用域

            function a() {
                function b() {
                    function c() {
                         //something
                    }
                    c();
                }
                b();
            }
            a();

            a defined a.[[scope]] -- > 0 : GO

            a doing   a.[[scope]] -- > 0 : aAO
                                       1 : GO

            b defined b.[[scope]] -- > 0 : aAO
                                       1 : GO

            b doing   b.[[scope]] -- > 0 : bAO
                                       1 : aAO
                                       2 : GO

            c defined c.[[scope]] -- > 0 : bAO
                                       1 : aAO
                                       2 : GO

            c doing   c.[[scope]] -- > 0 : cAO
                                       1 : bAO
                                       2 : aAO
                                       3 : GO

二、立即执行函数

        1.立即执行函数,执行完后立即销毁(释放)即针对初始化功能的函数
        2.对于函数,只有表达式才能被执行,外面有一层括号使之成为表达式

            var num = (function (a,b,c) {
                var d = a + b + c;
                return d;   
            }(1,2,3));   

三、闭包

1.函数累加器(可以不依赖于全局变量)
                function add() {
                    var count = 0;
                    function demo() {
                        count ++;
                        console.log(count);
                    }
                    return demo;
                }
                var counter = add();
                counter();
                counter();
2.可以做缓存(存储结构)
             1.  用对象返回两个函数
                function test() {
                    var food = "apple";
                    var obj = {
                        eat : function () {
                            if (food != "") {
                                console.log("I am eating " + food);
                                food = "";
                            }else{
                                console.log("There is nothing!");
                            }
                        },
                        pushFood : function (x) {
                            food = x;
                        }
                    }
                    return obj;
                }
                //用对象的形式返回出来,简化返回两个函数
                var person = test();

                person.eat();
                person.eat();
                person.pushFood('banana');
                person.eat();


            2  . 用数组返回两个函数
                function test() {
                    var num = 100;
                    function a() {
                        num ++;
                        console.log(num);
                    }           
                    function b() {
                        num --;
                        console.log(num);
                    }
                    return [a,b];
                }       
                var myArr = test();
                myArr[0]();
                myArr[1]();
3.可以实现封装,属性私有化
            function Deng(name, wife) {
                var prepareWife = 'xiaozhang';
                this.name = name;
                this.wife = wife;
                this.divorce = function () {
                    this.wife = prepareWife;
                }
                this.sayPrepareWife = function () {
                    console.log(prepareWife);
                }
            }

            var deng = new Deng('deng', 'xiaoliu');

            console.log(deng.prepareWife);  // undefined
            console.log(deng.sayPrepareWife()); //xiaozhang  闭包
4.模块化开发,防止污染全局变量
            变量可以不互相污染
            var name = "xyz";

            var init = (function () {
                var name = "abc";
                function callName() {
                    console.log(name);
                }
                return function () {
                    callName();
                }
            }());

            var initDeng = (function () {
                var name = "def";
                function callName() {
                    console.log(name);
                }
                return function () {
                    callName(); 
                }
            }());

            init();
            initDeng();

闭包产生的问题实例 (1)

              会打印出十个10
                function test() {
                    var arr = [];
                    for(var i = 0; i < 10; i ++){
                        arr[i] = function () {
                            document.write(i);
                        }
                    }
                    return arr;
                }

                var myArr = test();
                for(var j = 0; j < 10; j ++){
                    myArr[j]();
                }

解决方法(唯一)

              会打印出 0 - 9
                function test() {
                    var arr = [];
                    for(var i = 0; i < 10; i ++){
                        (function (x) {
                            arr[x] = function () {
                                document.write(x + " ");
                            }
                        }(i));
                    }
                    return arr;
                }

                var myArr = test();
                for(var j = 0; j < 10; j ++){
                    myArr[j]();
                }

闭包产生的问题实例及其解决 (2)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            list-style: none;
        }
        li:nth-of-type(2n){
            background-color: red;
        }
        li:nth-of-type(2n + 1){
            background-color: green;
        }
    </style>
</head>
<body>
    <ul>
        <li>a</li>
        <li>a</li>
        <li>a</li>
        <li>a</li>
    </ul>
    <script type="text/javascript">
        1.闭包产生的索引皆为4
        function test() {
            var liCollection = document.getElementsByTagName('li');

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

        test();

        2.解决后索引为0 1 2 3
        function test() {
            var liCollection = document.getElementsByTagName('li');

            for(var i = 0; i < liCollection.length; i ++){
                (function (x) {
                    liCollection[x].onclick = function () {
                        console.log(x);
                    }
                }(i))
            }
        }
        
        test();
    </script>
</body>
</html>

相关文章

  • javascript立即执行函数和闭包

    闭包 概念:当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链举例分析: 闭包的应用: 立即执行函数 ...

  • JavaScript难点

    原文链接 1、涉及知识点 JavaScript运行过程、预编译、执行期上下文、作用域、作用域链、立即执行函数、闭包...

  • JavaScript闭包(三)

    目录 1.执行环境与作用域链 2. 立即执行函数 3. 闭包知识点 3.1 什么是闭包 3.2 使用闭包的意义与注...

  • 作用域、立即执行函数、闭包

    一、作用域 二、立即执行函数 三、闭包 1.函数累加器(可以不依赖于全局变量) 2.可以做缓存(存储结构) 3.可...

  • 进阶11-闭包_定时器_BOM

    1. 使用立即执行函数生成闭包,利用其内部函数读取该函数局部作用域3种方式生成闭包 2.输出汽车参数的函数 3.s...

  • 所谓闭包

    所谓闭包 Closures (闭包)是使用被作用域封闭的变量,函数,闭包等执行的一个函数的作用域。通常我们用和其相...

  • 闭包作用

    闭包的作用:模仿块作用域、保存变量、封装私有变量(1)模仿块作用域:通过构建立即执行函数 通过特权方法来访问(静态...

  • 作用域与闭包(2)

    1、闭包当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。 基于词法作用域...

  • 闭包

    闭包 闭包是什么? 当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行,简单...

  • 闭包笔记

    闭包的定义 MDN 的定义: 闭包是函数和声明该函数的词法环境的组合。 词法作用域 参考作用域链: 函数在执行过程...

网友评论

      本文标题:作用域、立即执行函数、闭包

      本文链接:https://www.haomeiwen.com/subject/xszduftx.html