闭包的概念
闭包指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。
红宝书(p178)上对于闭包的定义:闭包是指有权访问另外一个函数作用域中的变量的函数。
MDN 对闭包的定义为:闭包是指那些能够访问自由变量的函数。 其中自由变量,指在函数中使用的,但既不是函数参数
arguments
也不是函数的局部变量的变量,其实就是另外一个函数作用域中的变量。
function getOuter(){
var date = '1127';
function getDate(str){
console.log(str + date); //访问外部的date
}
return getDate('今天是:'); //"今天是:1127"
}
getOuter();
其中date
既不是参数arguments
,也不是局部变量,所以date
是自由变量。
总结起来就是下面两点:
函数内部的变量,在函数外部是无法获取并且修改的。
function f() {
var n = 1
n = n + 1 // 我们打算让每执行一次,n+1
return n
}
f() // 2
f() // 2
f() // 2
// 每次执行函数,变量都被重新设置,并没有实现我们要的效果
闭包
闭包就是在函数的内部,在构建一个子函数,去影响函数的值,从而达到修改函数内部变量的效果。
function f() {
var n = 0
return (function() {
console.log(n++) // 子函数,每次修改父函数的 n + 1,并且通过父函数返回到外部
})
}
add = f()
add() // 0
add() // 1
add() // 2
对于闭包有下面三个特性:
- 1、闭包可以访问当前函数以外的变量
function getOuter(){
var date = '815';
function getDate(str){
console.log(str + date); //访问外部的date
}
return getDate('今天是:'); //"今天是:815"
}
getOuter();
- 2、即使外部函数已经返回,闭包仍能访问外部函数定义的变量
function getOuter(){
var date = '815';
function getDate(str){
console.log(str + date); //访问外部的date
}
return getDate; //外部函数返回
}
var today = getOuter();
today('今天是:'); //"今天是:815"
today('明天不是:'); //"明天不是:815"
- 3、闭包可以更新外部变量的值
function updateCount(){
var count = 0;
function getCount(val){
count = val;
console.log(count);
}
return getCount; //外部函数返回
}
var count = updateCount();
count(815); //815
count(816); //816