inject_var.js 4.2 KB

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