匿名函数是“函数”,闭包是一个关注的是变量所处的一个特殊环境的一个代码结构
//这是一个匿名函数,这个匿名函数返回一个闭包
function(){
return function(){}
}
函数在程序执行的时候,内部的变量会随着使用的结束而释放(因为函数内部的变量只有函数内部能访问,外部是访问不了的,不释放的话也没有意义,还浪费资源)。但是在函数式编程里打破了这个规则,因为“函数式编程”里函数是“一等公民”,他和其他类型的值一样可以被复制给变量,所以函数也能返回一个函数,这个被返回函数使用了所依托函数的内部变量,所以依托函数使用后,也不能把变量释放,这种特殊变量(也称之为“自由变量”)所在的函数被叫做“闭包”。
闭包和匿名函数其实是两个概念,但是使用上很容易弄混。比如:
//把匿名函数当作闭包使用
for(var i = 0; i < 5; i++){
setTimeout(function(){console.log(i)}, 1000)
}
//上面的想法初期的想法是:1秒钟之后输出0,1,2,3,4,但是结果是输出了5个5
//把上面的函数等价下面的写法,这样你就能看懂了,其实你打印的一直是最外面的i
var func = function(){console.log(i)}
for(var i = 0; i < 5; i++){
setTimeout(func, 1000)
}
//---------下面的是闭包正确的写法---------
var func = function(i){
return function(){
console.log(i)
}
}
for(var i = 0; i < 5; i++){
setTimeout(func(i), 1000)
}
//---------当然也放到一起----------------
for(var i = 0; i < 5; i++){
setTimeout((function(i){
return function(){
console.log(i)
}
})(i), 1000)
}
//---------再当然匿名函数的话还能这么实现---------
for(var i = 0; i < 5; i++){
let j = i//这里是let,不是var,如果是var将得到5个4,
setTimeout(function(){console.log(j)}, 1000)
}