三、JavaScript 笔记之闭包

当函数作为参数传入函数,该函数为高阶函数,当函数作为函数的返回结果返回,就形成了闭包。返回的函数被引用,该引用就保留了定义时的词法作用域,即该引用就是闭包。

1.函数作为返回值

        'use strict'
        function foo () {
            var attr = [];
            for(var i = 0; i < 10; i++){
                attr.push(function(){
                    return i;
                });
            }
            return attr;
        }
        var r = foo();
        console.log(r[0]()); //10
        console.log(r[1]()); //10
        console.log(r[2]());  //10

改造1:

       'use strict'
        function foo () {
            var attr = [];
            for(let i = 0; i < 10; i++){
                attr.push(function(){
                    return i;
                });
            }
            return attr;
        }
        var r = foo();
        console.log(r[0]()); //0
        console.log(r[1]()); //1
        console.log(r[2]());  //2

改造2:

        'use strict'
        function foo () {
            var attr = [];
            for(var i = 0; i < 10; i++){
                attr.push(function(n){
                    return function(){
                        return n;
                    }
                }(i));
            }
            return attr;
        }
        var r = foo();
        console.log(r[0]());
        console.log(r[1]());
        console.log(r[2]());  

2.返回对象携带闭包

        'use strict';

        function create_counter(initial) {
            var x = initial || 0;
            return {
                inc: function () {
                    x += 1;
                    return x;
                }
            }
        }
        var c1 = create_counter();
        c1.inc(); // 1
        c1.inc(); // 2
        c1.inc(); // 3

注意:对象中产生闭包,对象返回

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容