J'écrivais un programme javascript et l'exécutais dans Chrome 7, quand j'ai rencontré un comportement étrange. Maintenant, dans mon code, avec tout ce qui se passe, il m'a fallu du temps pour comprendre que ce n'était pas moi.Variable modifiée avant le fait, pouvez-vous expliquer ce comportement de Chrome V8?
J'ai distillé l'essence du code ci-dessous.
<html>
<script>
var data = [1,2,3,4,5];
var data_copy = [];
for (var i=0; i<data.length; i++){
data_copy.push(data[i]);
}
console.log("Printing before:");
console.log(data_copy);
//alert(data_copy);
console.log("------------------------");
for (var i=0; i<data_copy.length; i++){
data_copy[i] = data_copy[i] * 1000;
}
console.log("Printing after:");
console.log(data_copy);
</script>
</html>
Quand je lance ceci sur Chrome 7, je reçois la sortie qui suit dans la console Javascript:
Printing before:
[1000, 2000, 3000, 4000, 5000]
------------------------
Printing after:
[1000, 2000, 3000, 4000, 5000]
Comment se fait le premier appel à CONSOLE.LOG imprime la version modifiée de data_copy?
Maintenant, si je décommenter la « alerte » et exécuter le même code, je reçois ce que vous attendez normalement:
Printing before:
[1, 2, 3, 4, 5]
------------------------
Printing after:
[1000, 2000, 3000, 4000, 5000]
J'ai aussi essayé le code dans Node.js et je reçois le deuxième (normal) sortie.
Des idées?
Est-ce que cette optimisation JIT a mal tourné?
Ou est-ce que quelque chose me manque?
Une conjecture est que le navigateur exécute l'appel de se connecter de manière asynchrone, après le changement. Mais pourquoi ferait-il cela? – Hejazzman