JavaScript函数序列示例疑问:请求解析控制台输出30的执行逻辑
关于JavaScript闭包函数输出30的逻辑验证
你的推测完全正确!这其实是JavaScript里**闭包(Closure)**的经典应用场景,我来帮你再把执行逻辑拆解得更清晰一点,方便你加深理解:
首先先还原一下你提到的示例代码(根据你的描述补全):
function makeMultiplier(multiplier) { // 返回一个匿名函数,这个函数会捕获外部作用域的multiplier变量 return function(x) { return multiplier * x; }; } // 调用makeMultiplier并传入3,得到一个绑定了multiplier=3的函数 var multiplyBy3 = makeMultiplier(3); // 调用这个绑定后的函数,传入10 console.log(multiplyBy3(10)); // 输出30
详细执行步骤:
- 当你调用
makeMultiplier(3)时,函数的参数multiplier被赋值为3,此时函数内部返回了一个未执行的匿名函数。 - 核心点:这个匿名函数保留了它定义时所在的词法环境——也就是
makeMultiplier作用域里的multiplier=3这个值,哪怕makeMultiplier已经执行完毕退出,这个值依然被闭包“抓着”不会被垃圾回收。 - 把这个匿名函数赋值给
multiplyBy3后,multiplyBy3就变成了一个“自带乘数3”的函数,它的逻辑就是接收一个参数x,返回3 * x。 - 最后调用
multiplyBy3(10)时,传入的x是10,计算3*10得到30,所以控制台输出30。
补充个小知识点:如果再创建另一个乘数函数,比如var multiplyBy5 = makeMultiplier(5),它的multiplier会是5,和multiplyBy3完全独立,因为每个闭包都拥有自己的词法环境副本。
内容的提问来源于stack exchange,提问作者Questions
相关产品推荐
相关产品推荐

