我不确定这是否可能,但首先,为了澄清起见,我希望完成的一个例子。
以eval
函数为例,您可以编写如下内容:
(function() {
let a = 1;
let b = 2;
return eval('a + b') // returns 3
})()
所以上面的代码乍一看很简单。但是当你分解它时,你会发现这里实际上还有更多的事情发生。
在上面的例子中看到的我最感兴趣的行为是,a
和b
都是在本地定义的,eval
是用字符串参数调用的。
为了演示起见,让我们假装 eval 的实现是这样的:
function eval(string) {
//Magic
return result
}
因此,当调用 eval 时,应未定义a
和b
,因为 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);
})()