From 418a0bdaa231f0e8ad805554a5f2fd9641950155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=BE=9C?= <1ncounter.100@gmail.com> Date: Thu, 16 May 2024 15:25:19 +0800 Subject: [PATCH] Revert "fix: keep `this` in parse expression function" --- packages/renderer-core/src/utils/common.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/renderer-core/src/utils/common.ts b/packages/renderer-core/src/utils/common.ts index a9c5ffb8f..0462d358a 100644 --- a/packages/renderer-core/src/utils/common.ts +++ b/packages/renderer-core/src/utils/common.ts @@ -221,19 +221,22 @@ function parseExpression(a: any, b?: any, c = false) { thisRequired = c; } try { + const contextArr = ['"use strict";', 'var __self = arguments[0];']; + contextArr.push('return '); let tarStr: string; tarStr = (str.value || '').trim(); - let code = `"use strict"; function __wrapper(){ return ${tarStr}} return __wrapper.call(arguments[0])`; + // NOTE: use __self replace 'this' in the original function str + // may be wrong in extreme case which contains '__self' already + tarStr = tarStr.replace(/this(\W|$)/g, (_a: any, b: any) => `__self${b}`); + tarStr = contextArr.join('\n') + tarStr; // 默认调用顶层窗口的parseObj, 保障new Function的window对象是顶层的window对象 if (inSameDomain() && (window.parent as any).__newFunc) { - return (window.parent as any).__newFunc(code)(self); - } - if (!thisRequired) { - code = `with($scope){${code}}`; + return (window.parent as any).__newFunc(tarStr)(self); } + const code = `with(${thisRequired ? '{}' : '$scope || {}'}) { ${tarStr} }`; return new Function('$scope', code)(self); } catch (err) { logger.error(`${logScope || ''} parseExpression.error`, err, str, self?.__self ?? self);