Można używać połączeń pośrednich do numeru eval
.
Bezpośrednie połączenia nie będą działać, ponieważ będą używać kontekstu wykonywania wywołania, który prawdopodobnie zmieni się między utworzeniem zmiennej i próbą uzyskania do niej dostępu.
Zamiast tego, połączenia pośrednie do eval
będą używać globalnego kontekstu wykonania, a zatem zmienne będą się utrzymywać.
Niektóre sposoby nawiązywania połączeń pośrednich z eval
używają var myEval = eval; myEval(...)
lub window.eval(...)
.
var input = document.getElementById('input'),
data = document.getElementById('data');
document.getElementById('form').onsubmit = function() {
var code = input.value,
result = window.eval(code);
data.appendChild(document.createElement('dt')).appendChild(document.createTextNode(code));
data.appendChild(document.createElement('dd')).appendChild(document.createTextNode(result));
return false;
};
<form id="form">
<dl id="data"></dl>
<input id="input" />
<input type="submit" />
</form>
Na przykład, w powyższym fragmencie wprowadzić var x = 5
. Następnie wpisz x
, a otrzymasz 5
.
Ten 'eval' nie jest izolowany od kodu aplikacji. W związku z tym użycie konsoli może spowodować jej uszkodzenie (zniszczyć stan aplikacji). –
@RickHitchcock Ponieważ połączenia pośrednie do eval zachowują się inaczej niż połączenia bezpośrednie. Zobacz [§10.4.2] (http://www.ecma-international.org/ecma-262/5.1/#sec-10.4.2) – Oriol
@NoahFreitas True. Chciałem tylko zapewnić proste podejście, ale można je poprawić, uruchamiając kod w innym oknie, a także dodając "try ... catch", aby wychwycić błędy, dodając ładny wyświetlacz obiektów, ... – Oriol