如何在不使用全局变量的前提下实现JS函数仅首次执行时打印日志
不依赖全局变量的实现方案
下面提供两种对新手友好、实现简单的方案,都可以完全规避全局变量污染:
方案1:利用函数对象自定义属性(最简单)
JS 中函数本身就是对象,我们可以直接把状态挂载到函数自身的属性上,不会污染全局作用域,理解成本极低:
const testFunc = function (value) { // 状态直接挂在函数对象上,不属于全局变量 if (testFunc.hasExecuted) return; for (let i = 0; i < 10; i++) { console.log(value + i); } testFunc.hasExecuted = true; }; testFunc(5); // 首次调用正常打印10条结果 testFunc(5); // 后续调用无输出
对比原实现,还把判断逻辑从循环里移到了函数入口,避免了每次循环都做判断,性能也更好。
方案2:闭包封装私有状态(更安全)
用立即执行函数(IIFE)创建私有作用域,把状态变量藏在私有作用域里,外部完全无法访问到这个状态变量,不会被意外修改:
const testFunc = (function() { // 该变量仅在当前立即执行函数的作用域内有效,不会泄露到全局 let condition = false; return function(value) { if (condition) return; for (let i = 0; i < 10; i++) { console.log(value + i); } condition = true; } })(); testFunc(5); // 首次调用打印 testFunc(5); // 后续调用无输出
如果后续需要重置执行状态,还可以扩展重置方法,使用更灵活:
const testFunc = (function() { let condition = false; const innerFunc = function(value) { if (condition) return; for (let i = 0; i < 10; i++) { console.log(value + i); } condition = true; }; // 新增重置方法,需要重置状态时调用testFunc.reset()即可 innerFunc.reset = function() { condition = false; }; return innerFunc; })(); testFunc(5); // 打印 testFunc(5); // 不打印 testFunc.reset(); testFunc(5); // 重置后首次调用又可以打印
内容的提问来源于stack exchange,提问作者Zalokin
相关产品推荐
相关产品推荐

