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

关于JavaScript makeCounter()中value参数与set属性的技术疑问

关于makeCounter()中set属性与value参数的解惑

先给你掰明白这两个点,其实都是JS里「函数也是对象」这个核心特性在起作用:

一、counter.set到底是什么?

在JavaScript里,函数本质上也是对象——这意味着你可以像给普通对象加属性一样,给函数添加任意自定义的属性和方法。

这里的counter.set和Map.prototype.set()完全没关系,只是刚好重名了而已!它就是我们手动给counter这个函数对象加的一个属性,属性值是一个箭头函数,作用就是修改闭包里的count变量。

举个简单的类比:

function fn() {}
fn.myNickname = "小函数";
console.log(fn.myNickname); // 输出"小函数"

counter.set就是同样的逻辑,只是把属性值换成了用来设置计数值的函数而已。

二、value参数的来源与用法

value是这个箭头函数的形参(形式参数),当你调用counter.set(10)的时候,括号里的10就是传给它的实参(实际参数)。

换句话说:

  • 定义counter.set = value => count = value时,value只是一个占位符,代表未来调用时会传入的那个「要设置的新计数值」;
  • 当你执行counter.set(10),这个10就会被赋值给value,箭头函数内部再把闭包中的count变量改成value的值(也就是10)。

你完全可以把value换成别的名字,比如newCount,代码功能一点都不变:

counter.set = newCount => count = newCount;

只是用value更直观,一看就知道是要设置的目标值。

结合你的代码再梳理一遍流程

  1. 调用makeCounter()返回counter函数,此时闭包里的count初始为0;
  2. 两次调用counter(),每次返回当前count再自增,所以依次输出0、1,此时count变成2;
  3. 调用counter.set(10),把count直接设置为10;
  4. 调用counter(),返回当前count(10)再自增,输出10,此时count变成11;
  5. 调用counter.decrease(),把count减1,变回10;
  6. 再次调用counter(),返回当前count(10)再自增,输出10,此时count变成11。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:30