gpt4 book ai didi

javascript - 是否有将全局变量转换为局部变量的简单方法?

转载 作者:数据小太阳 更新时间:2023-10-29 04:52:10 26 4
gpt4 key购买 nike

假设我们有一个如下所示的函数:

const fn = () => x;

此函数应返回 x 的值,其中 x 在全局范围内可用。最初这是 undefined 但如果我们定义 x:

const x = 42;

然后我们可以期望 fn 返回 42

现在假设我们想将 fn 呈现为字符串。在 JavaScript 中,我们有 toString 用于此目的。然而,我们还假设我们希望最终在新的上下文中执行 fn(即使用 eval),因此它使用的任何全局引用都应该在我们调用之前或期间内化toString.

在将fn 转换为字符串时,如何使x 成为局部变量,其值反射(reflect)x 的全局值? 假设我们不知道 x 被命名为 x也就是说我们可以假设变量包含在同一个模块中。

最佳答案

如果您希望在将函数转换为字符串时锁定某些变量,则必须将这些变量与字符串化函数一起传递。

它可以像这样实现(用类型写—— typescript 符号)

const prepareForEval = 
(fn: Function, variablesToLock: { [varName: string]: any }): string => {
const stringifiedVariables = Object.keys(variablesToLock)
.map(varName => `var ${varName}=${JSON.stringify(variablesToLock[varName])};`);

return stringifiedVariables.join("") + fn.toString();
}

然后像这样使用它

const stringifiedFunction = prepareForEval(someFunction, { x: x, y: y })

// you can even simplify declaration of object, in ES6 you simply write
const stringifiedFunction = prepareForEval(someFunction, { x, y })
// all variables you write into curly braces will be stringified
// and therefor "locked" in time you call prepareForEval()

任何 eval 都会在执行的地方声明字符串化变量和函数。这可能是个问题,您可能会将某些变量重新声明为新的未知值,您必须知道字符串化函数的名称才能调用它,否则如果您重新声明已声明的 const,它可能会产生错误变量。

为了克服这个问题,您应该将字符串化函数实现为具有自己范围的立即执行的匿名函数,例如

const prepareForEval = 
(fn: Function, variablesToLock: { [varName: string]: any }): string => {
const stringifiedVariables = Object.keys(variablesToLock)
.map(varName => `var ${varName}=${JSON.stringify(variablesToLock[varName])};`);

return `
var ${fn.name} = (function() {
${stringifiedVariables.join("")}
return ${fn.toString()};
)();
`;
}

此修改将在单独的范围内声明函数和变量,然后将该函数分配给 fn.name 常量。变量不会污染作用域,在您eval 的地方,它只会声明新的fn.name 变量,这个新变量将被设置为反序列化函数。

关于javascript - 是否有将全局变量转换为局部变量的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42168444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com