函数连同它作用域链上的要找的这个变量,共同构成闭包
一般情况下使用闭包主要是为了
1.封装数据
2.暂存数据
一个典型的案例
function bindName(name){
return function(action){
console.log(`${name} is ${action}ing`)
}
}
var doing = bindName('xiaocheng')
doing('work')
doing('play')
var doing2 = bindName('xiaoma')
doing2('work')
doing2('play')
解析
MDN 上关于闭包的定义
A closure is the combination of a function and the lexical environment within which that function was declared.
以上代码相当于
function bindName(){
var name = arguments[0]
function fn(action){
console.log(`${name} is ${action}ing`)
}
return fn
}
var doing = bindName('xiaocheng')
因为 doing 在全局作用域永远无法被释放,导致 bindName 里声明的fn 和 name 一直存在, 执行 doing 时会从创建 fn 所在的作用域获取 name
简单说:doing引用fn,fn无法释放,fn里有name,name也无法释放,可用被引用
注意:每次执行bindName()都会产生一个闭包。
网友评论