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

猜你喜欢

转载自www.cnblogs.com/cxuer/p/9151575.html