我今天遇到了一个奇怪的错误。
当我在chrome中调用下面的函数时,我得到了:
var t = function(i){console.log(i); console.log(eval(“i”));};
T( “123”);
// chrome中的结果
123
未定义
但是上面的代码在firefox中调用了,它就像我想的那样出现了:第二个日志语句与第一个相同。
在我看来,eval语句将使用匿名函数的上下文作为其运行时上下文,其中包含参数。
我没有找到任何涉及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转换为对象
我无法弄清楚为什么会这样,所以我在开始时尝试了代码。
答案 0 :(得分:1)
console
函数的Chrome控制台实现涉及一些异步行为,会导致您发现的奇怪问题。
也就是说,在您的特定情况下,我的Chrome会将“123”记录两次。我发现用一些独特的识别文本增加调试输出通常是一个非常好的主意:
var t = function(i){console.log("param is " + i);console.log("eval result is " + eval("i"));};
Chrome控制台输出会折叠重复的行,并在前面加上一个带圆圈的小计数器:
http://gutfullofbeer.net/so/console_chrome.png
“123”之前的那个小“2”意味着它被记录了两次。