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

标签 javascript eval interpreter jquery-terminal

使用 eval 在 JavaScript 中创建 JavaScript 解释器应该很简单。我得到了这个(使用 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> '
});

Demo

但是当我执行 function foo() { ... } 时它不起作用foo未定义我需要使用 foo = function() { ... } 。 eval 的行为就像在 (function() { <code> })() 内执行。难道还有更复杂的代码也不起作用吗?

是否可以使用简单的代码创建一个 JavaScript 解释器而不使用js.js ,这与浏览器控制台的工作方式相同吗?

最佳答案

我创建了一个书签,它在页面中附加一种 REPL,专为主要的五种浏览器(Chrome 1+、IE 6+、Firefox 1+、Safari 3+、Opera 9+Can'不记得确切的版本)。
下面发布了评估代码的核心组件,稍加修改+注释。

/**
 * 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, ...

关于javascript - 如何使用 eval 在 JavaScript 中创建 JavaScript 解释器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11177349/

相关文章:

javascript - 为 webworkers 中的导入脚本指定字符集

python - Python3解释器中方法和类的位置

javascript - 包括来自外部 ASP 页面的菜单内容,保持菜单项被选中

javascript - 在没有ajax的情况下将多个变量传递到不同页面的最佳方法

php - 包括——使用字符串而不是文件名

Ruby 使用正则表达式评估表达式,没有 eval

asp.net - #Eval if 语句在中继器中

parsing - 动态 (?) 解析器

compiler-construction - 解释器和动态类型语言

javascript - 必需 ="required"输入字段以另一个输入字段为条件