zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Redis常见数据类型
    MYSQL常见可优化场景
    算术切片
    找数组里没出现的数
    不同路径和(II)
    不同路径和
    最小路径和
    强盗抢房子
    丑数(2)
    判断子序列
  • 原文地址:https://www.cnblogs.com/cxuer/p/9151575.html
Copyright © 2011-2022 走看看