理解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
相关产品推荐
相关产品推荐

