饥人谷学习进阶第 18 天
闭包的一些概念
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
网友评论