javascript之闭包初探(闭包中传)

闭包:

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

show code to you!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
function foo() {
var a = 2;
function bar() {
console.log( a );
}
return bar;
}
var baz = foo();
baz(); // 2 —— 朋友,这就是闭包的效果。

在foo()执行后,通常会期待引擎的垃圾回收器释放掉不再使用的内存空间,销毁foo() 的整个内部作用域。而闭包的“神奇”之处正是可以阻止这件事情的发生。事实上内部作用域依然存在,并没有被回收。bar()本身在使用这个内部作用域;bar() 依然持有对该作用域的引用,这个引用就叫作闭包。

无论使用何种方式对函数类型的值进行传递,当函数在别处被调用时都可以观察到闭包。
show code to you again!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
function foo() {
var a = 2;
function baz() {
console.log( a ); // 2
}
bar( baz );
}
function bar(fn) {
fn(); // 这是闭包!
}

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

tip1:延迟函数的回调会在循环结束时才执行。

如果作用域是空的,那么仅仅将它们进行封闭是不够的。IIFE需要包含一点实质内容才能为我们所用。【根据闭包的定义】

star Huang wechat
my wechat public welcomes to your attention