JavaScript自包含无参箭头函数实现调用次数统计咨询
原代码的核心问题
- 函数第一行就执行
counter = 0,每次调用都会强制重置计数器,永远累计不出正确的次数 - 箭头函数没有独立的
this指向,代码里的this.counter根本绑定不到你声明的counter变量,拿不到预期值 - counter未通过
let/const/var声明,会自动挂载到全局对象上,既容易被其他代码篡改,也不符合“完全自包含”的要求
可行实现
1. 闭包版(完全密封内部状态,最贴合自包含要求)
把计数器包裹在立即执行函数形成的独立作用域里,外部完全访问不到内部counter,只能通过函数调用获取累计值,不会被意外修改:
const countTimesCalled = (() => { let counter = 0; return () => { counter += 1; return counter; }; })();
调用效果:第一次调用返回1,第二次返回2,后续以此类推。
2. 函数属性版(思路和你原代码更接近)
利用函数本身是对象的特性,把计数器挂载在函数自身的属性上,仅在第一次调用时做初始化,避免每次重置:
const countTimesCalled = () => { // 仅首次调用时初始化计数器 if (countTimesCalled.counter === undefined) { countTimesCalled.counter = 0; } countTimesCalled.counter += 1; return countTimesCalled.counter; };
这个版本的counter会作为函数的公开属性存在,如果外部特意修改countTimesCalled.counter的值会影响计数,对状态安全要求不高的场景完全可用。
内容的提问来源于stack exchange,提问作者nan
相关产品推荐
相关产品推荐

