JavaScript闭包!(个人见解)

20 阅读1分钟

闭包的概念想必大家已经说的不爱说了。

函数在执行时可以 记住并且访问 所在 词法作用域 时,就产生了闭包

那么什么是词法作用域呢?
词法作用域是 定义表达式并能被访问的区间。

我们来看一段代码,这就是最基础的闭包:

function foo() {
    var a = 2;
    function bar() {
        console.log( a );
    }
    return bar;
}
var baz = foo();
baz();

【函数执行之后,foo()的整个作用域依然存在,没有被回收。baz()在调用时可以随时访问定义时的词法作用域,以及变量a。】
bar()声明的位置所在,使得它拥有foo()内部作用域的闭包,该作用域会一直存在不被销毁,以供bar()在之后的任何时间进行引用。bar()依然保持着对该作用域的引用,这个引用就叫做闭包。

是不是还是不懂???
那我举个例子!

function wait(msg) {
    setTimeout( function timer() {
        console.log(msg);
    }, 1000 );
}
wait("Hello");

以上代码块setTimeout 1000ms执行后,timer的内部作用域不会消失。timer有涵盖wait作用域的闭包,所以也可以访问msg变量。

1、在我们日常开发中,将函数(访问它们各自的词法作用域)当作第一级的值类型并到处传递,你就会看到闭包在这些函数中的应用。
2、在定时器、事件监听器、Ajax 请求、跨窗口通信、Web Workers 或者任何其他的异步(或者同步)任务中,只要使用了回调函数,实际上就是在使用闭包!

--- IIFE 会通过声明并立即执行一个函数来创建作用域。 注:IIFE:立即执行函数。 示例:(function() { console.log(123) })()