Как я могу обнаружить, что я внутри вызова eval()?
Существует ли строка s
такая, что
(new Function(s))();
и
eval(s);
ведут себя по-другому? Я пытаюсь "обнаружить", как оценивается строка.
Ответы
Ответ 1
Проверьте объект arguments
. Если он существует, вы находитесь в функции. Если это не было eval
ed.
Обратите внимание, что вам нужно поместить проверку для 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 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