关于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更直观,一看就知道是要设置的目标值。
结合你的代码再梳理一遍流程
- 调用
makeCounter()返回counter函数,此时闭包里的count初始为0; - 两次调用
counter(),每次返回当前count再自增,所以依次输出0、1,此时count变成2; - 调用
counter.set(10),把count直接设置为10; - 调用
counter(),返回当前count(10)再自增,输出10,此时count变成11; - 调用
counter.decrease(),把count减1,变回10; - 再次调用
counter(),返回当前count(10)再自增,输出10,此时count变成11。
内容的提问来源于stack exchange,提问作者Fotios Tsakiris
相关产品推荐
相关产品推荐

