我有一个javascript文件,读取另一个文件,其中可能包含需要eval() - ed的javascript片段.脚本片段应该符合javascript的严格子集,这限制了它们可以做什么以及它们可以更改哪些变量,但我想知道是否有某种方法可以通过阻止eval在全局范围内查看变量来强制执行此操作.类似于以下内容:
function safeEval( fragment ) { var localVariable = g_Variable; { // do magic scoping here so that the eval fragment can see localVariable // but not g_Variable or anything else outside function scope eval( fragment ); } }
实际的代码不需要看起来像这样 - 我对任何和所有带闭包的奇怪技巧都是开放的等等.但我确实想知道这是否可能.
简答:不.如果它在全球范围内,它可用于任何事物.
答案很长:如果你是eval()
不信任的代码,真的想要阅读或搞乱你的执行环境,那你就搞砸了.但是,如果您拥有并信任正在执行的所有代码,包括正在执行的代码eval()
,您可以通过覆盖执行上下文来伪造它:
function maskedEval(scr) { // set up an object to serve as the context for the code // being evaluated. var mask = {}; // mask global properties for (p in this) mask[p] = undefined; // execute script in private context (new Function( "with(this) { " + scr + "}")).call(mask); }
我必须再次强调:
这仅用于屏蔽受信任的代码与执行它的上下文.如果您不信任代码,请不要
eval()
(或将其传递给新代码Function()
,或以任何其他方式使用它eval()
).