1

我今天遇到了一个奇怪的错误。

当我在 chrome 中调用以下函数时,我得到了:

var t = function(i){console.log(i);console.log(eval("i"));};

t("123");

//chrome的结果

123

不明确的

但是上面的代码在firefox中调用,结果和我想的一样:第二条log语句和第一条一样。

在我看来,eval 语句将使用匿名函数的上下文作为其运行时上下文,其中包含参数。

我没有发现任何涉及评估上下文和参数的材料。

谁能告诉我为什么?


实际上,我使用 tempo.js 渲染 html 并出现了与上面列出的类似的问题。

源代码在这里:

    _replaceVariables: function (renderer, _tempo, i, str) {
        return str.replace(this.varRegex, function (match, variable, args) {
            try {
                ...

                if (variable === '.') {
                    val = eval('i');
                } else if (utils.typeOf(i) === 'array') {
                    val = eval('i' + variable);
                } else {
                    val = eval('i.' + variable);
                }
                .....
            } catch (err) {
                console.log(err);
            }

            return '';
        });
    },

在 chrome 中运行时,eval 语句出现如下错误:

TypeError:无法将 null 转换为对象

我不知道为什么会这样,所以我一开始就尝试了代码。

4

1 回答 1

1

函数的 Chrome 控制台实现console涉及一些异步行为,这些行为会导致奇怪的问题,例如您发现的问题。

也就是说,在您的特定情况下,我的 Chrome 记录了两次“123”。我发现使用一些独特的识别文本来增加调试输出通常是一个非常好的主意:

var t = function(i){console.log("param is " + i);console.log("eval result is " + eval("i"));};

Chrome 控制台输出折叠重复的行并在它们前面加上一个带圆圈的小计数器:


(来源:gutfullofbeer.net

“123”之前的那个小“2”意味着它被记录了两次。

于 2013-05-08T15:57:31.043 回答