进阶篇(闭包(18-1))
饥人谷学习进阶第 18 天闭包的一些概念
【进阶篇(闭包(18-1))】A closure is the combination of a function and the lexical environment within which that function was declared. --MDN
一个闭包就是一个函数以及声明该函数的词法作用域的结合
闭包 = 函数 + 词法作用域
A closure is the local variables for a function - kept alive after the function has returned . --javascriptkit
闭包是函数的局部变量,在函数返回之后仍然存在
词法作用域(lexical environment) 在此重新回顾一下作用域链:
- 函数在执行过程中,先从自己内部找变量
- 如果找不到,再从创建当前函数的作用域(词法作用域)去找,以此往上
- 注意找的是变量的当前的状态
函数连同它作用域链上的要找的那个变量 共同构成闭包
一般情况下运用闭包主要是为了
- 封装数据
- 暂存数据
function car(){
var speed = 0
function fn(){
speed++
console.log(speed)
}
return fn
}var speedUp = car()
speedUp()//1
speedUp()//2
在全局作用域下
speedUp
一直存在,即 car()
中的 fn
一直存在,所以 car()
里面的作用域就一直存在无法被销毁,因其内的 speed
被 fn
这个函数所使用。通过案例可以将闭包理解为:
函数(如:fn())连同它的词法作用域下使用的变量(如:speed)
闭包相关案例
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]() ) // 3
// (2)
var fnArr = []
for (var i = 0;
i < 10;
i ++) {
(function(i){
fnArr[i] =function(){
return i
}
})(i)
}
console.log( fnArr[3]() ) // 3
// (3)
var fnArr = []
for (let i = 0;
i < 10;
i ++) {
fnArr[i] =function(){
return i
}
}
console.log( fnArr[3]() ) // 3
推荐阅读
- 2018年11月19日|2018年11月19日 星期一 亲子日记第144篇
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 拍照一年啦,如果你想了解我,那就请先看看这篇文章
- 亲子日记第186篇,2018、7、26、星期四、晴
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 两短篇
- 第四十三篇接纳孩子的感受
- 感恩日记第111篇2020.02.06
- 2018年8月25日|2018年8月25日 星期六 晴 亲子日记第259篇
- 25篇中考随笔