闭包的定义
《JavaScript高级程序设计》:
闭包是指有权访问另一个函数作用域中的变量的函数
《JavaScript权威指南》:
从技术的角度讲,所有的JavaScript函数都是闭包:它们都是对象,它们都关联到作用域链。
《你不知道的JavaScript》
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
创建一个闭包
function foo(){
var a = 2;
return function fn(){
console.log(a);
}
}
let func = foo();
func();//输出2
闭包使得函数可以继续访问定义时的词法作用域。拜 fn 所赐,在 foo() 执行后,foo 内部作用域不会被销毁。
闭包的作用
能够访问函数定义时所在的词法作用域(阻止其被回收)。
私有化变量
function base(){
let x = 10;//私有变量
return {
getX:function(){
return x;
}
}
}
模拟块级作用域
var a = [];
for(var i = 0; i < 10;i++){
a[i] = (function(j){
return function(){
console.log(j);
}
})(i);
}
a[6]();
创建模块
function coolModule(){
let name = 'xinran001';
let age = 20;
function sayName(){
console.log(name);
}
function sayAag(){
console.log(age);
}
return{
sayName,
sayAag
}
}
let info = coolModule();
info.sayName();//xinran001
- 模块模式具有两个必备的条件(来自《你不知道的JavaScript》)
- 必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块实例)
- 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态。