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ます。Google Chromeでは表示されるだけObjectですがid=1、ドリルダウンすると表示されます。

この奇妙な動作の理由はconsole、オブジェクト(文字列だけでなく)をログに記録していることを理解し、コンソールを表示または更新するたびに、そのオブジェクトの現在の状態が表示されるためです。

この動作でエラーが発生しやすく、直感に反している場合は、次の回避策があります。

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

また、これはJavaScriptデバッガーの動作方法であり、JavaScript自体のせいではないことにも注意してください。

于 2012-08-26T09:09:04.187 に答える
2

いいえ、console.logは同期しています。ただし、作成するオブジェクトは1つだけで、このオブジェクトをコンソールに「出力」します。その後、このオブジェクトのプロパティを変更します(オブジェクトは参照によって渡されます)。コンソールには、このオブジェクトの最近の状態のみが表示され、ログに記録された時点からのスナップショットは表示されません。

于 2012-08-26T09:04:46.990 に答える