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

一、作用域

            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)




    
    Document
    


    
  • a
  • a
  • a
  • a

你可能感兴趣的:(作用域、立即执行函数、闭包)