You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

匿名函数与常规函数的行为差异解惑

匿名函数与常规函数的行为差异解惑

嘿,我来帮你搞清楚这两段代码为啥输出不一样~本质上是闭包的创建时机和复用性在起作用!

先看第一段代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:50:28