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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:38:17