在循环中调用函数时出现奇怪的javascript行为

时间:2012-08-26 09:01:53

标签: javascript

我正在运行一个简单的测试,我得到一个奇怪的行为,这里是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()是否异步?

2 个答案:

答案 0 :(得分: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的错误本身

答案 1 :(得分:2)

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