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

在循环中调用函数时奇怪的javascript行为,javascript,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(inde

我正在运行一个简单的测试,发现一个奇怪的行为,下面是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.logparams显示id为“9”,而我希望它为“0”。console.log是异步的吗?

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

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

好吧,您的代码片段过于复杂,请尝试以下操作:

var params = {id: 0};
console.log(params);
params.id = 1;
在Firefox中,它显示:

Object { id=0 }
但当我点击一个对象向下搜索时,它显示id=1。在谷歌浏览器中,它只显示对象,但向下钻取时id=1

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

如果您发现这种行为容易出错且违反直觉,那么以下是一些解决方法:

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

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

好吧,您的代码片段过于复杂,请尝试以下方法:

var params = {id: 0};
console.log(params);
params.id = 1;
在Firefox中,它显示:

Object { id=0 }
但当我点击一个对象向下搜索时,它显示id=1。在谷歌浏览器中,它只显示对象,但向下钻取时id=1

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

如果您发现这种行为容易出错且违反直觉,那么以下是一些解决方法:

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

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

一个较短的测试用例是:var A={'id':0};console.loga;a、 id=1;这是从一个更复杂的函数中提取出来的,并且为了提问的目的进行了简化,这就是为什么它是这样构造的;console.loga;a、 id=1;这是从一个更复杂的函数中提取出来的,并且为了提问的目的进行了简化,这就是为什么它的结构是这样的。但是这是违反直觉的,当我控制台记录对象时,我希望它记录当前状态,而不是脚本结束后的状态。此外,如果我在循环中记录它,它将显示相同的对象9次,但如果我只记录id,它将显示每个迭代的正确id???但这是违反直觉的,当我在console.log对象时,我希望它记录当前状态,而不是脚本结束后的状态。另外,如果我在循环中记录它,它会显示相同的对象9次,但是如果我只记录id,它会显示每个迭代的正确id???