是否存在s
这样的字符串
(new Function(s))();
和
eval(s);
表现不同?我正在尝试“检测”如何评估字符串。
检查arguments
对象。如果它存在,那么您就在函数中。如果不是,它已被eval
编辑。
请注意,您必须将检查放在这样arguments
的try...catch
块中:
var s = 'try {document.writeln(arguments ? "Function" : "Eval") } catch(e) { document.writeln("Eval!") }';
(new Function(s))();
eval(s);
解决了nnnnnn
的顾虑。为此,我编辑了 eval 函数本身:
var _eval = eval;
eval = function (){
// Your custom code here, for when it's eval
_eval.apply(this, arguments);
};
function test(x){
eval("try{ alert(arguments[0]) } catch(e){ alert('Eval detected!'); }");
}
test("In eval, but it wasn't detected");
当前答案在严格模式下不起作用,因为您无法重新定义 eval。此外,eval
由于许多其他原因,重新定义是有问题的。
区分它们的方法是基于这样一个事实……它们中的一个创建了一个函数,而什么没有。函数能做什么?他们可以return
东西:)
我们可以简单地利用它并做一些事情return
:
// is in function
try {
return true;
} catch(e) { // in JS you can catch syntax errors
false; //eval returns the return of the expression.
}
所以在例子中:
var s = "try{ return true; }catch(e){ false; }";
eval(s); // false
Function(s)(); // true
(new Function(s))(); // true, same as line above
(function(){ return eval(s); })(); // the nested 'problematic' case - false
if (new Error().stack.indexOf('at eval') > -1) {
console.log('Oh noo, I am being evaled');
}