闭包的定义
MDN 的定义:
闭包是函数和声明该函数的词法环境的组合。
词法作用域
参考作用域链:
- 函数在执行过程中,先从自己内部找变量。
- 如果找不到,再从创建当前函数的所在作用域去找,往上类推。
- 注意找的变量是当前的状态
闭包主要是为了:
- 封装数据
- 暂存数据
闭包案例1
function car() {
var speed = 0;
function fn() {
speed++;
console.log(speed);
}
return fn;
}
var speedUp = car();
speedUp(); // 1
speedUp(); // 2
闭包案例2
如果想输出3,要如何改造代码?
var fnArr = [];
for(var i = 0; i<10 ;i++) {
fnArr[i] = function () {
return i;
}
}
console.log(fnArr[3]()) // 10
改造1
var fnArr = [];
for(var i = 0; i<10 ;i++) {
fnArr[i] = (function(j){
return function() {
return j;
}
})(i)
}
console.log(fnArr[3]()) ;
改造2
var fnArr = [];
for(let i=0;i<10;i++) {
fnArr[i] = function() {
return i;
}
}
console.log(fnArr[3]()); // 3
闭包案例3
封装 car() 函数,类似 MDN 案例 中模拟私有方法
var car = (function() {
var speed = 0;
function set(s) {
speed = s;
}
function get() {
return speed;
}
function speedUp() {
speed++;
}
function speedDown() {
speed--;
}
return {
set:set,
get:get,
speedUp:speedUp,
speedDown:speedDown
}
})()
car.set(30) // 30
car.get() //30
car.speedUp()
car.get() //31
car.speedDown() //30
car.get() // 30
闭包案例4
实现一个sum,实现如下调用:
console.log(sum(1)(2)); // 3
console.log(sum(4)(-3)); // 1
// 实现
function sum(i) {
return function(j) {
return i+j;
}
}
参考阅读
- 饥人谷闭包课件,饥人谷
- MDN闭包章节,MDN
- wikiPedia定义,wikiPedia
网友评论