18

是否存在s这样的字符串

(new Function(s))();

eval(s);

表现不同?我正在尝试“检测”如何评估字符串。

4

3 回答 3

31

检查arguments对象。如果它存在,那么您就在函数中。如果不是,它已被eval编辑。

请注意,您必须将检查放在这样argumentstry...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");​
于 2012-09-01T12:09:06.473 回答
15

当前答案在严格模式下不起作用,因为您无法重新定义 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
于 2013-12-19T19:59:55.787 回答
2
if (new Error().stack.indexOf('at eval') > -1) {
    console.log('Oh noo, I am being evaled');
}
于 2020-11-21T09:53:46.457 回答