美文网首页
JavaScript的闭包

JavaScript的闭包

作者: 云凡的云凡 | 来源:发表于2020-11-22 17:56 被阅读0次

当内部函数被返回到外部并保存时,一定会产生闭包,闭包会产生,原来的作用域不能释放,过渡的闭包可能会导致内存泄漏,或加载过慢。

// 闭包做数据缓存
        function test() {
            var n = 100;
            function add() {
                n++
                console.log(n);
            }
            function reduce() {
                n--;
                console.log(n);
            }
            return [add, reduce]
        }
        var arr = test()
        arr[0]()//101
        arr[1]()//100
        arr[1]()//99
        arr[1]()//98
        arr[1]()//97
        arr[1]()//96

增删改查

   function breadMgr(num) {
            // var breadNum = num || 10
            var breadNum = arguments[0] || 10

            function storage() {
                breadNum += 10
                console.log(breadNum);
            }
            function sale() {
                breadNum--;
                console.log(breadNum);
            }
            return [storage, sale]
        }
        var breadMgr = breadMgr(50)
        breadMgr[0]()//60
        breadMgr[1]()//59
        function rechang(name) {
            var opt = {
                showThing: function () {
                    console.log("hello " + name);
                }
            }
            return opt
        }
        var things = rechang("mary")
        things.showThing()//hello mary
        function test() {
            for (var i = 0; i < 10; i++) {
                (function () {
                    document.writeln(i + ' ')
                })()
            }
        }
        test()//0 1 2 3 4 5 6 7 8 9
        function test() {
            for (var i = 0; i < 10; i++) {
                console.log(i);
            }
        }
        test()//0 1 2 3 4 5 6 7 8 9

        var a = []
        for (var i = 0; i < 10; i++) {
            a[i] = function () {
                console.log(i);
            }
        }
        a[5]()//10


        var b = []
        for (let i = 0; i < 10; i++) {
            b[i] = function () {
                console.log(i);
            }
        }
        b[5]()//5

形成闭包

    <script>
        // 把 add 方法返回出去赋值给了 adds 变量,然后adds变量成了一个新的函数,
        // 这个函数其实就是test里面那个add方法,里面的add方法拽着test的AO,
        // test的AO有num,所以可以任意修改
        function test() {
            var num = 0
            function add() {
                console.log(++num);
            }
            return add
        }
        var adds = test()
        adds()//1
    </script>

闭包缓存数据1

        function myClass() {
            var student = []
            var operations = {
                join: function (name) {
                    student.push(name)
                    console.log(student);
                    document.writeln(student + `<br>`)

                },
                leave: function (name) {
                    for (var i = 0; i < student.length; i++) {
                        var item = student[i]  //优化for循环性能的方法
                        if (item === name) {
                            student.splice(i, 1)
                        }
                    }
                    console.log(student + "123");
                    document.writeln(student + `<br>`)
                }
            }
            return operations
        }
        var opt = myClass()
        opt.join('张三')
        opt.join('李四')
        opt.join('王五')
        opt.leave('李四')

闭包缓存数据2

        function myClass() {
            var student = []
            var operations = {
                join: function (name) {
                    student.push(name)
                    console.log(student);
                    document.writeln(student + `<br>`)

                },
                leave: function (name) {
                    // for (var i = 0; i < student.length; i++) {
                    //     var item = student[i]  //优化for循环性能的方法
                    //     if (item === name) {
                    //         student.splice(i, 1)
                    //     }
                    // }
                    var idx = student.indexOf(name)
                    if (idx !== -1) {
                        student.splice(idx, 1)
                    }
                    console.log(student + "123");
                    document.writeln(student + `<br>`)
                }
            }
            return operations
        }
        var opt = myClass()
        opt.join('张三')
        opt.join('李四')
        opt.join('王五')
        opt.leave('李四')

相关文章

  • JavaScript----闭包

    javascript之闭包 闭包的概念     闭包(closure)是 JavaScript 的一种语法特性。 ...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • javascript中闭包是什么

    javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。闭包就...

  • Javascript 闭包

    闭包 (注:所以案例以 javascript 实现) 初识闭包 什么是闭包 MDNClosures are fun...

  • 20170815 前端开发日报

    JavaScript闭包,只学这篇就够了 闭包不是魔法 这篇文章使用一些简单的代码例子来解释JavaScript闭...

  • 作用域闭包

    概览 背景知识:JavaScript内存管理、JavaScript作用域。 内容 1 闭包定义 闭包:当函数可以记...

  • JavaScript 作用域

    概览 背景知识:JavaScript内存管理、JavaScript作用域。 内容 1 闭包定义 闭包:当函数可以记...

  • 笔记:JavaScript闭包

    本文摘录及参考自:1. 学习Javascript闭包(Closure)2. 闭包的秘密3. JavaScript ...

  • JavaScript深入理解-闭包(Closure)

    推荐文章:学习Javascript闭包(Closure)- 阮一峰javascript深入理解-从作用域链理解闭包...

  • 闭包

    学习Javascript闭包(Closure)

网友评论

      本文标题:JavaScript的闭包

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