• JavaScript中的闭包


    一、什么是闭包

    • 在MDN中闭包的定义为:闭包是函数和声明该函数的词法环境的组合。
    • 在《你不知道的JavaScript上卷》中讲解相关闭包部分有一句话我特别喜欢:“JavaScript闭包无处不在。你只需要之别并拥抱它”。在本书中的定义为:当函数可以记住并访问所在的词法作用域,即函数是在当前词法作用域之外执行,这时就产生了闭包。

    二、实践出真知

    function foo () {
        var a = 2;
        function bar() {
            console.log(a);
        }
        return bar;
    }
    var baz = foo(); //相当于内部的bar函数
    baz(); // 2
    // foo执行后,foo()的内部作用域不会被销毁。
    function foo () {
        var a = 2;
        function bar() {
            console.log(a);
        }
        baz(bar);
    }
    function baz(fn) {
        fn();   // 相当于foo函数内部的bar函数
    }

    无论通过任何手段将内部函数传递到所在的词法作用域意外,都会对持有原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。 在定时器、事件监听器、Ajax请求、跨窗口通信、Web Workers或者任何其它的异步或者同步任务中,只要使用了回调函数,实际上就是在使用闭包。

    三、循环中的闭包

    for (var i=0; i<=5; i++) {
        setTimeout(function timer() {
            console.log(i);
        }, i*1000)
    }
    for (var i=0; i<=5; i++) {
        (function(j) {
            setTimeout(function timer() {
                console.log(j);
            }, i*1000)
        })(i);
    }

    四、闭包的用途

    对闭包有了基本的了解,但是对于实际应用在项目中如何选择,何时使用还是不能做出很好的判断,后续更新...

    在我的博文中,恰好有一个循环闭包的例子(动态生成表格的每一行的操作按钮如何获取当前行的index):http://www.cnblogs.com/cxuer/p/7521960.html

    感觉这篇文章写的不错:https://www.cnblogs.com/yunfeifei/p/4019504.html

  • 相关阅读:
    跟一声响骚扰说“拜拜”
    来电过滤 全靠防火墙
    android sd卡读取数据库
    Java程序员十戒
    Java常用的正则表达式验证
    Java 3D 教程:6. Java 3D 与用户界面
    成为Java高手的25个学习目标
    Java数据结构内容整理
    Java中类与类之间的关系
    求助,Java字符串分割问题
  • 原文地址:https://www.cnblogs.com/cxuer/p/9151575.html
Copyright © 2020-2023  润新知