闭包的概念
闭包指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。
红宝书(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 = 1n = n + 1 // 我们打算让每执行一次,n+1return n}f() // 2f() // 2f() // 2// 每次执行函数,变量都被重新设置,并没有实现我们要的效果
闭包
闭包就是在函数的内部,在构建一个子函数,去影响函数的值,从而达到修改函数内部变量的效果。
function f() {var n = 0return (function() {console.log(n++) // 子函数,每次修改父函数的 n + 1,并且通过父函数返回到外部})}add = f()add() // 0add() // 1add() // 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); //815count(816); //816
