JavaScript:从远程函数访问调用站点局部变量



我不确定这是否可能,但首先,为了澄清起见,我希望完成的一个例子。

eval函数为例,您可以编写如下内容:

(function() {
let a = 1;
let b = 2;
return eval('a + b') // returns 3
})()

所以上面的代码乍一看很简单。但是当你分解它时,你会发现这里实际上还有更多的事情发生。

在上面的例子中看到的我最感兴趣的行为是,ab都是在本地定义的,eval是用字符串参数调用的。

为了演示起见,让我们假装 eval 的实现是这样的:

function eval(string) {
//Magic
return result
}

因此,当调用 eval 时,应未定义ab,因为 eval 的函数范围与原始调用站点的函数范围不同。

为了证明这一点,如果我们尝试为eval创建一个简单的包装器,如下所示:

function eval_wrapper(str) {
return eval(str)
}

并调用原始示例代码,用eval_wrapper代替eval

(function() {
let a = 1;
let b = 2;
return eval_wrapper('a + b') // throws 'a is not defined' error
})()

您将看到我们收到错误:Uncaught ReferenceError: a is not defined

所以我的问题是,eval如何访问局部变量,我们是否可以编写一些代码,通过以某种方式访问调用站点范围来允许eval_wrapper执行而不会出错。

也许在同一个范围内定义它?

(function() {
function eval_wrapper(str) {
return eval(str)
}
let a = 1;
let b = 2;
let c = eval_wrapper('a + b') // throws 'a is not defined' error
console.log(c);
})()

最新更新