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

JS调用add5(2)时参数如何传递给inner函数的y形参

参数传递逻辑解析

核心原因是makeAdder是返回函数的高阶函数,add5拿到的根本不是makeAdder本身,而是makeAdder执行后返回的内部inner函数,整个执行流程拆解如下:

  • 首先明确makeAdder的运行规则:它接收形参x,执行后不会返回普通计算值,而是直接把内部定义的inner函数作为返回值抛出。inner本身是接收形参y、返回x+y的函数,受JavaScript词法作用域+闭包特性约束,inner会永久持有它定义位置所在作用域的所有变量绑定,哪怕外层的makeAdder已经执行结束退出调用栈。
  • 执行var add5 = makeAdder(5)阶段的逻辑:
    • 引擎调用makeAdder函数,把实参5绑定到makeAdder的形参x上
    • makeAdder执行到return语句,把内部的inner函数返回,赋值给变量add5
    • 此时makeAdder本身执行完毕出栈,但返回的inner一直持有当前作用域里x=5的绑定,这部分内存不会被垃圾回收
  • 执行add5(2)阶段的逻辑:
    • 此时add5的本质就是inner函数的引用,和已经执行完的makeAdder没有调用层面的关联
    • 传入的实参2会直接绑定到inner自己声明的形参y上
    • 函数执行时,y取本次传入的2,x从闭包保存的绑定里取之前存入的5,最终计算返回5+2=7,加到count上后count最终值为7

常见误区:很多人会误以为add5是makeAdder的别名,实际上makeAdder(5)是函数调用表达式,执行完之后拿到的是return的结果也就是inner,后续对add5的传参都是传给inner,和已经执行结束的makeAdder形参x没有关系。x的值在第一次调用makeAdder(5)的时候就已经固定在闭包里了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:48:52