请考虑两段代码(第一段打印“Local eval”,第二段打印“Global eval”):
(function f() {
var x;
try {
eval("x");
console.log('Local eval');
}
catch (e) {
console.log('Global eval');
}
}())
和
var globalEval = eval;
(function f() {
var x;
try {
globalEval("x");
console.log('Local eval');
}
catch (e) {
console.log('Global eval');
}
}())
事实证明,即使globalEval === eval
评估为true
,globalEval
和eval
行为也不同,因为它们的名称不同。 (如果精确写入eval
,则eval只能是本地的。)
我如何区分两种逃避?有没有办法提取变量标签来推断行为?
答案 0 :(得分:2)
有趣。但是,由于您可以控制定义eval
的引用的位置/时间,因此您可以说明如何区分它们。例如,有一个具有“函数指针”的对象和指示范围的东西 - 如果你定义它,你知道你的位置。
即。 myEvaluator.scope
会告诉您有关eval范围被捕获的位置的信息,myEvaluator.eval
可用于评估。