Решение nnnnnn. Для этого я сам отредактировал функцию eval:
var _eval = eval;
eval = function (){
// Your custom code here, for when it 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");
Ответ 2
Текущий ответ не работает в строгом режиме, так как вы не можете переопределить eval. Более того, переопределение eval проблематично по многим другим причинам.
Способ их разграничения основан на том, что хорошо... один из них создает функцию, а что нет. Что могут делать функции? Они могут return stuff:)
Мы можем просто использовать это и сделать что-то с 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