关于JavaScript某闭包示例的运行逻辑疑问
拆解这段JavaScript闭包代码的运行机制
嘿,我来一步步帮你捋清楚这段代码的运行逻辑,核心就是闭包对变量引用的特性:
先把代码格式化得更易读:
function f(param){ var n = function(){ return param; // 内部函数引用外部的param变量 }; param++; // 给param加1 return n; // 返回内部函数 } var inner = f(1); inner(); // 猜猜返回值是多少?答案是2!
具体运行步骤:
- 第一步:调用
f(1),此时f的执行上下文被创建,参数param被赋值为1。 - 第二步:定义内部函数
n,这个函数里引用了外部作用域的param变量——这就是闭包的核心:内部函数会保留对外部作用域变量的引用,而不是复制当时的值。 - 第三步:执行
param++,这时候param的值从1变成了2。因为闭包抓的是变量本身,所以这个变化会被后续的调用感知到。 - 第四步:
f执行完毕,返回内部函数n,并把它赋值给inner。这里要注意:虽然f的执行上下文已经退出栈了,但因为inner还持有对param的引用,所以param不会被垃圾回收机制销毁,依然存在于内存中。 - 第五步:调用
inner(),也就是执行那个内部函数,它会返回当前param的实际值——也就是2。
关键误区提醒:
很多人会误以为闭包保存的是变量的初始值(比如这里的1),但实际上闭包保存的是对变量的引用,所以外部作用域中变量的任何修改,都会在闭包调用时体现出来。
内容的提问来源于stack exchange,提问作者akotch
相关产品推荐
相关产品推荐

