Ik heb een bookmarklet gemaakt met een soort REPL op een pagina, ontworpen voor de vijf belangrijkste browsers (Chrome 1+, IE 6+, Firefox 1+, Safari 3+, Opera 9+ Kan me de herinnering niet herinneren exacte versie ).
De kerncomponent, die de code evalueert, wordt hieronder gepost, enigszins gewijzigd + geannoteerd.
/**
* Evaluates some code in the global scope.
* @param String code: Code to eval
* @return Stringified result, prefixed with 'E:' if error.
*/
function globalEval(/*string*/ code) {
var win = window, r, raw;
try {
if (win.execScript) {//eval in IE sucks, so use execScript instead
r = win.$_$_$globalEval$_$_$ = {c:code};
win.execScript('try{$_$_$globalEval$_$_$.r=eval($_$_$globalEval$_$_$.c);}catch(e){$_$_$globalEval$_$_$.e=e}');
///*Optional clean-up:*/ delete win.$_$_$globalEval$_$_$;
if (r.e) throw r.e;//Error
raw = r.r;
} else {
raw = win.eval(code);
}
r = '' + raw;//Stringify in the try-block
//It is possible that an error is thrown
//for example, for the following code: ({toString:1})
} catch(err) {
r = (err + '');//Convert error to string
//IE: If found, "[object" will be at index zero, which is falsy
if (!r.indexOf('[object')) r = err.message;
//r =
r = 'E:' + (raw=r);
} finally {
//raw = unmodified result (or Error instance)
//FOR THIS EXAMPLE, raw is not used, and string r is returned
return /*string*/ r;
}
}
Ik heb de functionaliteit geïmplementeerd in een vorm die verschillende besturingselementen bevat, waaronder een tekstveld voor invoer + uitvoer.
Opmerking: de code wordt geëvalueerd in de globale context. En zo zullen alle variabelen in code
worden gelekt naar de globale scope. Voor een tolk kunt u een iframe gebruiken om een nieuw bereik te maken (en de var win
in mijn functie aan te passen).
var win = frames['name_of_frame'], ...//or
var win = frame_DOM_element.contentWindow, ...