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

strange javascript behaviour when calling function in a loop

本文关键字:javascript 行为 循环 调用 函数      更新时间:2023-09-26

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

好吧,你的代码片段太复杂了,试试这个:

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

在Firefox中显示:

Object { id=0 }

但当我点击一个对象向下搜索时,它会显示id=1。在Google Chrome中,它只显示Object,但向下搜索时显示id=1

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

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

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

还要注意的是,这就是JavaScript调试器的工作方式,这不是JavaScript的错本身

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