新年新气象,分享一个超级形象,容易理解的解释闭包的概念,希望新的一年小伙伴们不再被闭包困扰。
闭包犹如编程语言中的吸血鬼,他们捕获部下并给其永久的生命,直到自己被摧毁。唯一的区别在于,闭包不会在阳光下化为灰烬。–Michael Fogus
上面这句话出自javascript函数式编程,我认为是目前对于闭包最形象而一针见血的解释。要理解闭包,一定要关注捕获的概念,说到底就干了一件事‘捕获’。
捕获局部变量
function showname() {
var name = 'tom'
return function() {
console.log('the name is:' + name)
}
}
var person = showname()
person()
// =>the name is:tom
一个函数中的局部变量被返回的函数捕获,从而使得这些被捕获的局部变量不会随着原函数执行的结束而结束,而是被保存了下来。
捕获函数参数
function sum(x) {
return function(y) {
console.log(x+y)
}
}
var compute = sum(4)
compute(4)
// => 8
compute(8)
// => 12
这里内部返回的函数引用了外部函数的函数参数,使得该参数被保存下来,类似于局部变量的捕获,函数参数也可以被闭包捕获。