如何将函数末尾变量传入同一函数下次运行开头并实现文本高亮切换?
问题解决方案
一、函数跨调用的变量传递实现
要让函数下次运行时能用上上次末尾设置的变量,不能把变量定义在函数内部(每次调用函数都会重新初始化内部变量),得把变量放在函数外部的作用域里,比如全局作用域,或者用闭包封装。
修改你提供的function1示例代码:
// 把val1放在函数外部,作为外层作用域变量 let val1 = { id: null, name: '' }; function function1() { if (val1.id === 5) { console.log(val1.id, val1.name); } else { console.log('首次运行,还未设置val1的值'); } // 每次运行末尾更新变量状态 val1.id = 5; val1.name = 'name'; }
第一次调用function1()会进入else分支,第二次及以后调用就会触发if分支的打印逻辑——因为val1的状态被保留在外部作用域中,不会随函数调用结束而销毁。
二、文本高亮切换的逻辑完善
要实现“高亮-恢复”的切换效果,需要额外存储两个关键状态:上次高亮的文本范围,以及该范围的原始高亮颜色。结合你已有的文本范围获取代码,调整逻辑如下:
// 外层作用域存储状态变量,保留跨调用的状态 let previousRange = null; let originalHighlightColor = null; // 将文本范围获取逻辑封装为可复用函数 function getTargetRange(pText, feedback, y, range) { const target = pText.substring(feedback.location[y].start, feedback.location[y].end); const ranges = range.split([target], true, true, false); const myR = ranges.getFirst(); const startRange = myR.getRange(Word.RangeLocation.end); const ranges1 = range.split([target], true, false, false); const myR1 = ranges1.getFirst(); const endRange = myR1.getRange(Word.RangeLocation.end); return startRange.expandTo(endRange); } // 高亮切换核心函数 function toggleHighlight(colorCode) { // 如果已有高亮范围,先恢复原始颜色 if (previousRange) { previousRange.highlightColor = originalHighlightColor; // 重置状态,为下次切换做准备 previousRange = null; originalHighlightColor = null; return; } // 无高亮状态时,执行新高亮逻辑(需确保pText、feedback、y、range变量已定义) const targetRange = getTargetRange(pText, feedback, y, range); // 保存原始高亮颜色 originalHighlightColor = targetRange.highlightColor; // 设置新高亮颜色 targetRange.highlightColor = colorCode; // 保存当前高亮范围 previousRange = targetRange; }
调用toggleHighlight('#FFFF00')(黄色示例)时,第一次执行会给目标文本设置高亮;第二次调用同一函数,会将该文本范围恢复为原始颜色,完成“高亮-恢复”的切换循环。
内容的提问来源于stack exchange,提问作者Nikola Batinica
相关产品推荐
相关产品推荐

