匿名函数和闭包的区别

匿名函数是“函数”,闭包是一个关注的是变量所处的一个特殊环境的一个代码结构

//这是一个匿名函数,这个匿名函数返回一个闭包
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)
}
此条目发表在js, 程序基础分类目录,贴了标签。将固定链接加入收藏夹。