在真实的场景中,究竟在哪些地方能体现闭包的存在?
1. 返回一个函数;
代码语言:javascript复制function f1() {
var a=2;
return function f2() {
console.log(a);
//2
};
};
var num=f1();
num();
2. 作为函数参数传递;
代码语言:javascript复制var a = 1;
function f1() {
var a = 2;
function f2() {
console.log(a);
};
f3(f2);
};
function f3(fn) {
fn();
};
f1();
// 2
3. 在定时器、事件监听、Ajax请求、跨窗口通信、Web Workers或者任何异步中,只要使用了回调函数,实际上就是在使用闭包;
以下的闭包保存的仅仅是window和当前作用域:
代码语言:javascript复制// 定时器
setTimeout(function timeHandler(){
console.log('定时器');
},100);
// 事件监听
$('#app').click(function(){
console.log('事件监听');
});
4. IIFE(立即执行函数表达式)创建闭包,保存了全局作用域 window 和 当前函数 的作用域,因此可以使用全局的变量。
代码语言:javascript复制var a=2;
(function IIFE(){
console.log(a);
// 2
})();