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

理解JavaScript静态成员变量:实例化计数及无输出问题

两次实例化Gadget出现不同输出的原因解析

场景一:使用立即执行函数表达式(IIFE)的情况

代码示例:

var Gadget = (function(){
    var counter = 0;
    return function(){ console.log( counter += 1 );}
})();

var g1 = new Gadget();
var g2 = new Gadget();

这里的Gadget其实是IIFE执行后返回的内部函数:

  • IIFE执行时会生成一个私有作用域,里面的counter被初始化为0,内部函数会闭包这个counter变量。
  • 每次new Gadget()本质是调用这个内部函数,闭包的counter会被持续累加,所以第一次实例化打印1,第二次打印2,最终控制台最后显示的结果是2。

场景二:未使用立即执行的情况

代码示例:

var Gadget = (function(){
    var counter = 0;
    return function(){ console.log( counter += 1 );}
}); // <---- 未立即执行
var g1 = new Gadget();
var g2 = new Gadget();

这里的Gadget只是一个普通的外层函数,并没有执行:

  • 当你new Gadget()时,只是创建了这个外层函数的实例,但外层函数本身不会触发任何输出——它只是定义了counter并返回另一个函数,但实例化过程中并没有调用这个返回的函数。
  • 如果要看到输出,需要调用实例返回的函数,比如g1(),此时才会执行打印逻辑。而且每次实例化外层函数都会生成新的作用域,每个实例的counter都是独立的,调用g1()和g2()都会打印1。

内容的提问来源于stack exchange,提问作者zabitstack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:54:35