JavaScript闭包疑问:为何调用原函数后外部变量值未改变?
问题解析:闭包与函数调用的独立作用域
先看你写的代码:
function num() { let number = 0; console.log(number) return function() { return number++ } }
核心原因:每次调用num()都会生成全新的作用域和变量
- 执行
let add = num()时,num()会完整跑一遍逻辑:创建局部变量number并赋值为0,打印0,然后返回内部函数。这个内部函数形成闭包,会绑定当前这次num()调用时生成的number变量。 - 之后多次调用
add(),修改的都是这个被闭包绑定的number,所以能得到递增的值。 - 但再次调用
num()时,相当于重新执行了一遍num的逻辑:会重新创建一个全新的let number = 0,和之前add()绑定的number是完全独立的两个变量,所以控制台还是输出0,返回的新函数也会绑定这个新的number。
实际验证示例
你可以试试这段代码,更直观感受:
let add1 = num(); // 控制台打印0 add1(); // 返回0,此时add1绑定的number变为1 add1(); // 返回1,number变为2 let add2 = num(); // 控制台打印0,这里的number是新创建的,和add1的无关 add2(); // 返回0,这个number变为1
能明显看到add1和add2操作的是完全隔离的变量,互不影响。
总结
闭包保存的是函数单次调用时的作用域变量,而非函数本身的变量。每次调用外层函数num(),都会生成全新的作用域和局部变量,这些变量之间完全独立,不会互相干扰。
内容的提问来源于stack exchange,提问作者Sopo1805
相关产品推荐
相关产品推荐

