是否存在字符串s
(new Function(s))();
和
eval(s);
表现不同?我正试图“检测”字符串的评估方式。
答案 0 :(得分:31)
检查arguments
对象。如果它存在,那么你就在这个功能中。如果不是,那就是eval
。
请注意,您必须将arguments
的格式设置在try...catch
块中,如下所示:
var s = 'try {document.writeln(arguments ? "Function" : "Eval") } catch(e) { document.writeln("Eval!") }';
(new Function(s))();
eval(s);
Solution to nnnnnn
's concern.为此,我编辑了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");
答案 1 :(得分:14)
当前答案在严格模式下无效,因为您无法重新定义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
答案 2 :(得分:0)
if (new Error().stack.indexOf('at eval') > -1) {
console.log('Oh noo, I am being evaled');
}