【问题标题】:javascript eval context not contains parameters in chromejavascript eval上下文不包含chrome中的参数
【发布时间】:2013-05-08 15:56:23
【问题描述】:

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

当我在 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 转换为对象

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

【问题讨论】:

  • 看起来 chrome eval 函数只执行代码,不返回值。在 chrome 和 firefox 中尝试 eval("console.log(i)")
  • @Eugene 它实际上返回值,这是我的错误。谢谢。

标签: javascript parameters eval


【解决方案1】:

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

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

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

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


(来源:gutfullofbeer.net

“123”之前的那个小“2”表示它被记录了两次。

【讨论】:

  • 感谢您的大力帮助,这是我犯的错误。我没有注意到小“2”:(。但实际上我在这样的 eval 语句中遇到了类型错误。你知道为什么吗?
猜你喜欢
  • 2012-02-19
  • 1970-01-01
  • 2021-03-13
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多