匿名函数是“函数”,闭包是一个关注的是变量所处的一个特殊环境的一个代码结构
//这是一个匿名函数,这个匿名函数返回一个闭包 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) }