2

を使用して JavaScript で JavaScript インタープリターを作成するのは簡単なはずevalです。これを取得しました(jQueryターミナルを使用):

term = $('#term_demo').terminal(function(command, term) {
    if (command !== '') {
        var result = window.eval("(" + command + ")");
        if (result !== undefined) {
            term.echo(String(result));
        }
    } else {
       term.echo('');
    }
}, {
    greetings: 'Javascript Interpreter',
    name: 'js_demo',
    height: 200,
    prompt: 'js> '
});

デモ

function foo() { ... }しかし、foois not defined I need to useを実行すると機能しませんfoo = function() { ... }。eval 内で実行されたように動作します(function() { <code> })()。動作しないより複雑なコードはありますか?

js.jsを使用せずに単純なコードを使用して、ブラウザーコンソールと同じように機能する JavaScript インタープリターを作成することは可能ですか?

4

2 に答える 2

2

主要な 5 つのブラウザー (Chrome 1+、IE 6+、Firefox 1+、Safari 3+、Opera 9+正確なバージョンを覚えていない)用に設計された、一種の REPL をページに追加するブックマークレットを作成しました。 .
コードを評価するコア コンポーネントは以下に掲載されており、わずかに変更され、注釈が付けられています。

/**
 * 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;
    }
}

入力 + 出力テキスト領域を含むいくつかのコントロールを含むフォームに機能を実装しました。

注: コードはグローバル コンテキストで評価されます。そのため、変数はすべてcodeグローバルスコープにリークされます。インタープリターの場合、iframe を使用して新しいスコープを作成 (およびvar win関数で変更) できます。

var win = frames['name_of_frame'], ... // or
var win = frame_DOM_element.contentWindow, ...
于 2012-06-24T13:19:24.783 に答える
0

着信コマンドの周りに追加する括弧は、不正な構文を生成します。代わりに、匿名の自己実行関数でラップする必要があります。

例: http://jsfiddle.net/bW6Fv/1/

var command = "function foo(x){return x+x;} alert(foo(10));";

window.eval("!function(){" + command + "}()");​

編集

評価されたスクリプトをグローバルに利用できるようにする場合は、それらをラップしないままにするか、グローバル ウィンドウ オブジェクトに値を明示的に割り当てる必要があります。

例: http://jsfiddle.net/bW6Fv/2/

var command = "window.foo = function(x){return x+x;}; alert(foo(10));";

window.eval("!function(){ " + command + "}();");
window.eval("alert(foo(20));");

command = "function bar(x){return x / 2;}; alert(bar(10));";

window.eval(command);
window.eval("alert(bar(20));");
于 2012-06-24T13:16:12.933 に答える