1

我正在运行一个简单的测试,我得到一个奇怪的行为,这里是 js 代码:

 var handler = function(index,params){

    params.id = index;

}

function test(){
    var params = {'id':0};
    console.log(params);
    gradualRepetitionCalls(0,10,params);
}



function gradualRepetitionCalls(index, maxIndex,params) 
{
    if (index < maxIndex) 
    {
        handler(index,params);
        index++;

        gradualRepetitionCalls(index,maxIndex,params);
    }
}

test();

奇怪的是,console.log(params)显示id是'9',而我希望它是'0'。是console.log()异步的吗?

4

2 回答 2

3

好吧,你的代码片段过于复杂,试试这个:

var params = {id: 0};
console.log(params);
params.id = 1;

在 Firefox 中,它显示:

Object { id=0 }

但是当我单击一个对象向下钻取时,它会显示id=1. 在谷歌浏览器中,它只显示Object,但是id=1当向下钻取时。

这种奇怪行为的原因是,console了解您正在记录一个对象(而不仅仅是一个字符串),并且每次查看控制台或刷新它时,它都会显示该对象的当前状态。

如果您发现这种行为容易出错且违反直觉,这里有一些解决方法:

console.log(JSON.stringify(params));
console.log(params.id);

另请注意,这就是 JavaScript 调试器的工作方式,这不是 JavaScript本身的错。

于 2012-08-26T09:09:04.187 回答
2

不,console.log 是同步的。但是您只创建了一个对象并将该对象“输出”到控制台 - 之后,您更改了该对象的属性(对象通过引用传递!)。控制台只显示该对象的最近状态,而不是从它被记录的时间点开始的快照。

于 2012-08-26T09:04:46.990 回答