|
| 1 | +moduleObject.injectVars = (vars) => { |
| 2 | + // 遍历 vars 对象,将其中的键值对转化为局部变量 |
| 3 | + for (let key in vars) { |
| 4 | + let value = vars[key]; |
| 5 | + |
| 6 | + // 根据类型判断并转化值 |
| 7 | + if (value === undefined) { |
| 8 | + value = 'undefined'; // undefined转为 'undefined' |
| 9 | + } else if (value === null) { |
| 10 | + value = 'null'; // null 转为 'null' |
| 11 | + } else if (value === '') { |
| 12 | + value = "''"; // 空字符串转为 "''" |
| 13 | + } else if (typeof value === 'boolean') { |
| 14 | + value = value ? 'true' : 'false'; // 布尔值转为 'true' 或 'false' |
| 15 | + } else if (typeof value === 'object') { |
| 16 | + if (Array.isArray(value)) { |
| 17 | + value = JSON.stringify(value); // 数组转为 JSON 字符串 |
| 18 | + } else if (value instanceof Date) { |
| 19 | + value = `new Date("${value.toISOString()}")`; // Date 对象转为日期字符串 |
| 20 | + } else if (value instanceof RegExp) { |
| 21 | + value = value.toString(); // 正则表达式转为字符串表示 |
| 22 | + } else { |
| 23 | + value = JSON.stringify(value); // 普通对象转为 JSON 字符串 |
| 24 | + } |
| 25 | + } |
| 26 | + |
| 27 | + // 构造赋值代码,并通过 eval 动态执行 |
| 28 | + let _code = `moduleObject.${key} = ${value}`; |
| 29 | + console.log(_code); // 打印每个注入的变量代码 |
| 30 | + eval(_code); // 使用 eval 在当前作用域中定义变量 |
| 31 | + } |
| 32 | +} |
| 33 | +moduleObject.injectMethodVars = async function (method, args, vars) { |
| 34 | + async function _inner() { |
| 35 | + let input; |
| 36 | + let MY_URL; |
| 37 | + // 遍历 vars 对象,将其中的键值对转化为局部变量 |
| 38 | + for (let key in vars) { |
| 39 | + let value = vars[key]; |
| 40 | + |
| 41 | + // 根据类型判断并转化值 |
| 42 | + if (value === undefined) { |
| 43 | + value = 'undefined'; // undefined转为 'undefined' |
| 44 | + } else if (value === null) { |
| 45 | + value = 'null'; // null 转为 'null' |
| 46 | + } else if (value === '') { |
| 47 | + value = "''"; // 空字符串转为 "''" |
| 48 | + } else if (typeof value === 'boolean') { |
| 49 | + value = value ? 'true' : 'false'; // 布尔值转为 'true' 或 'false' |
| 50 | + } else if (typeof value === 'object') { |
| 51 | + if (Array.isArray(value)) { |
| 52 | + value = JSON.stringify(value); // 数组转为 JSON 字符串 |
| 53 | + } else if (value instanceof Date) { |
| 54 | + value = `new Date("${value.toISOString()}")`; // Date 对象转为日期字符串 |
| 55 | + } else if (value instanceof RegExp) { |
| 56 | + value = value.toString(); // 正则表达式转为字符串表示 |
| 57 | + } else { |
| 58 | + value = JSON.stringify(value); // 普通对象转为 JSON 字符串 |
| 59 | + } |
| 60 | + } |
| 61 | + |
| 62 | + // 构造赋值代码,并通过 eval 动态执行 |
| 63 | + let _code = `${key} = ${value}`; |
| 64 | + console.log(_code); // 打印每个注入的变量代码 |
| 65 | + eval(_code); // 使用 eval 在当前作用域中定义变量 |
| 66 | + } |
| 67 | + |
| 68 | + // 打印 inject 的变量值,确保它们在 eval 中被正确注入 |
| 69 | + console.log('=====inject vars====='); |
| 70 | + console.log(input); // 现在 input 应该是定义好的 |
| 71 | + console.log(MY_URL); // MY_URL 应该被注入并可用 |
| 72 | + |
| 73 | + // 执行传入的 method |
| 74 | + return await method(...args); |
| 75 | + } |
| 76 | + |
| 77 | + return await _inner(); |
| 78 | +}; |
| 79 | + |
| 80 | + |
| 81 | +const injectVars = {input: '你好', MY_URL: 'https://example.com'}; |
| 82 | +const functions = ['class_parse', '预处理', '推荐', '一级', '二级', '搜索', 'lazy']; |
| 83 | + |
| 84 | +for (let func of functions) { |
| 85 | + if (typeof moduleObject[func] === 'function') { |
| 86 | + // 如果是箭头函数 |
| 87 | + if (moduleObject[func].toString().includes('=>')) { |
| 88 | + const originalMethod = moduleObject[func]; |
| 89 | + |
| 90 | + // 包装箭头函数,将其改为闭包函数 |
| 91 | + moduleObject[func] = function (...args) { |
| 92 | + const self = injectVars; // 动态注入 self |
| 93 | + return (async (...innerArgs) => { |
| 94 | + // 调用原始的箭头函数 |
| 95 | + return await originalMethod.apply(self, innerArgs); |
| 96 | + })(...args); |
| 97 | + }; |
| 98 | + } |
| 99 | + } |
| 100 | +} |
0 commit comments