匿名函数与常规函数的行为差异解惑
匿名函数与常规函数的行为差异解惑
嘿,我来帮你搞清楚这两段代码为啥输出不一样~本质上是闭包的创建时机和复用性在起作用!
先看第一段代码:
let counter= (function (){ let count = 0; return function() { count+=1; return count; } })() for (let i = 0; i< 3; i++){ console.log(counter()); }
这段用了立即执行函数表达式(IIFE)——定义完这个匿名函数后,立刻就执行了它。执行时,函数内部创建了一个count变量,然后返回了一个内部函数,这个内部函数会“记住”它所在的词法环境(也就是包含count的那个作用域)。
关键在于:counter变量保存的就是这个返回的内部函数。所以循环里三次调用counter(),都是在调用同一个函数,复用的是同一个count变量!第一次调用count从0变成1,第二次从1变成2,第三次从2变成3,自然输出1、2、3。
再看第二段代码:
function increment() { let count = 0; return function() { count+=1; return count; } } for (let i = 0; i< 3; i++){ console.log(increment()()); }
这里的increment是个普通函数,每次调用increment()时,都会重新创建一个全新的count变量,然后返回一个新的内部函数。循环里的increment()()相当于:先调用increment()生成一个带着新count=0的闭包,接着立刻调用这个新函数,count变成1后返回,之后这个闭包就被丢弃了。下一次循环又重复这个过程:新的count=0、新的内部函数,调用后还是返回1。所以三次循环每次都输出1。
简单提炼核心差异:
- 第一段代码只创建了一次闭包,
counter是同一个函数,共享同一个count; - 第二段代码每次循环都创建全新的闭包,每个闭包都有独立的
count,所以每次都是从0开始累加。
备注:内容来源于stack exchange,提问作者Aravind Piratla
相关产品推荐
相关产品推荐

