如何通过循环重声明全局作用域的函数变量并保留全局作用域
批量包装全局作用域函数的实现方案
没问题,这个需求完全可以实现!你不用再手动逐个覆盖全局函数,通过遍历目标函数名数组结合全局对象就能批量完成包装,还能完整保留原函数的全局作用域和行为。
核心思路
- 借助全局对象(ES2020+推荐用通用的
globalThis,兼容浏览器、Node.js等所有环境)访问全局作用域中的函数 - 定义需要包装的函数名数组,遍历数组批量处理每个函数
- 保存原函数的引用,用自定义包装逻辑包裹后重新赋值回全局对象
代码示例
假设你原本在全局作用域有这些函数:
// 全局作用域下的原函数 function a() { console.log('执行原生函数a'); return 'a的返回结果'; } function b() { console.log('执行原生函数b'); return 'b的返回结果'; }
下面是批量包装的实现代码:
// 定义需要批量包装的全局函数名数组 const targetFunctions = ['a', 'b']; // 遍历数组完成批量包装 targetFunctions.forEach(fnName => { // 获取全局作用域中的原函数 const originalFn = globalThis[fnName]; // 仅处理函数类型的全局变量,避免误操作非函数值 if (typeof originalFn === 'function') { // 包装后的新函数,这里可以自定义你的包装逻辑 globalThis[fnName] = function(...args) { console.log(`[包装器] 开始执行函数 ${fnName}`); // 调用原函数,保留原函数的this指向和参数传递 const result = originalFn.apply(this, args); console.log(`[包装器] 函数 ${fnName} 执行完成,返回值:${result}`); return result; }; } });
关键细节说明
globalThis的优势:它是ES2020标准引入的全局对象,在浏览器、Node.js、Web Worker等环境下都能正确指向全局作用域,比window或global更通用。- 保留原函数行为:使用
originalFn.apply(this, args)来调用原函数,确保原函数的this指向和参数传递和原生调用完全一致,不会破坏原函数的逻辑。 - 安全校验:加入
typeof originalFn === 'function'的判断,避免数组中存在非函数名时导致错误。
测试验证
调用包装后的函数:
a(); // 输出: // [包装器] 开始执行函数 a // 执行原生函数a // [包装器] 函数 a 执行完成,返回值:a的返回结果 b(); // 输出: // [包装器] 开始执行函数 b // 执行原生函数b // [包装器] 函数 b 执行完成,返回值:b的返回结果
内容的提问来源于stack exchange,提问作者ThomasReggi
相关产品推荐
相关产品推荐

