如何使用eval在JavaScript中创建JavaScript解释器?

如何使用eval在JavaScript中创建JavaScript解释器?,javascript,eval,interpreter,jquery-terminal,Javascript,Eval,Interpreter,Jquery Terminal,使用eval在JavaScript中创建JavaScript intepreter应该很简单。我得到了这个(使用jQuery终端): 但是当我执行function foo(){…}时它不工作foo没有定义,我需要使用foo=function(){…}。eval的行为类似于在(function(){})(中执行。是否会有更复杂的代码无法工作 是否可以使用简单的代码创建JavaScript解释器而不使用,其工作原理与浏览器控制台相同?在传入命令周围附加的括号产生非法语法。你应该用一个铅笔包起来 例

使用
eval
在JavaScript中创建JavaScript intepreter应该很简单。我得到了这个(使用jQuery终端):

但是当我执行
function foo(){…}
时它不工作
foo
没有定义,我需要使用
foo=function(){…}
。eval的行为类似于在
(function(){
})(
中执行。是否会有更复杂的代码无法工作


是否可以使用简单的代码创建JavaScript解释器而不使用,其工作原理与浏览器控制台相同?

在传入命令周围附加的括号产生非法语法。你应该用一个铅笔包起来

例如:

编辑 如果希望已计算的脚本全局可用,则必须将其展开或显式地为全局窗口对象指定值

例如:


我创建了一个bookmarklet,在页面中添加了一种REPL,专为五大浏览器设计(Chrome1+、IE 6+、Firefox1+、Safari3+、Opera9+不记得确切的版本)。
评估代码的核心组件发布在下面,稍加修改和注释

/**
 * 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创建新的作用域(并在my函数中修改
var-win


jQuery终端看起来并不“简单”。你的目标是什么,你被困在哪里?@RobW简单地说,我指的是解释器函数(8行代码,它可以有2行),这不起作用
函数foo(x){return x+x;}
foo(10)
你为什么不想使用js.js?@Alex因为js.js是
594KB
而且js已经有解释器了它的call
eval
4b
(如果我想在代码中实际使用的话,没有更多)。谢谢我在一个代码中使用它,但是调用之间的状态如何
eval((function(){function foo(x){return x+x;})()
eval(“(函数(){alert(foo(10));}”
不同的上下文foo是未定义的,我如何处理它们?@jcubic在您的第一个代码中,
函数foo
是在本地创建的。如果您想更改JavaScript功能,您必须进行大量的修改。我更喜欢全局范围,因为我想提供一种与页面交互的方式。我想我需要将命令放在括号内,但它会我好像不知道,谢谢。
var command = "function foo(x){return x+x;} alert(foo(10));";

window.eval("!function(){" + command + "}()");​
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));");
/**
 * 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;
    }
}
var win = frames['name_of_frame'], ... // or
var win = frame_DOM_element.contentWindow, ...