一,什么是闭包
闭包是指有权访问另一个函数作用域中的变量的函数
二,闭包产生的原因
首先要明白作用域的概念,当访问一个变量时,解释器首先在当前作用域查找,如若没有找到,就去父作用域找,直到找到改变量的标示符。例如:
var a = 1;
function f1() {
var a = 2
function f2() {
var a = 3;
console.log(a);//3
}
}
闭包产生的本质就是,当前环境中还存在指向腹肌作用域的引用。
function f1() {
var a = 2
function f2() {
console.log(a);//2
}
return f2;
}
var x = f1();
x();
此段代码就产生了闭包。
二,闭包有哪些表现形式?
在以下场景能够体现闭包的存在:
1.返回一个函数。
2.作为函数参数传递
3.在定时器、事件监听、Ajax请求、跨窗口通信、Web Workers或者任何异步中,只要使用了回调函数,实际上就是在使用闭包。
// 定时器
setTimeout(function timeHandler(){
console.log('111');
},100)
// 事件监听
$('#app').click(function(){
console.log('DOM Listener');
})
4.IIFE(立即执行函数表达式)创建闭包, 保存了全局作用域window
和当前函数的作用域
,因此可以全局的变量。