Oggi mi sono imbattuto in un comportamento davvero strano con javascript. Penso di averlo capito in qualche modo ora, ma mi piacerebbe sapere se ciò che penso stia accadendo davvero o se ci sia qualche altra magia coinvolta. Quindi questo è il mio codice:Perché console.log() non cattura un'istantanea delle variabili passate?
var SomeObject = {};
SomeObject.foo = function(a, b) {
var baz = this.bar(a, b);
console.log(baz);
console.log(baz.left);
SomeObject.magicalStuff(baz);
};
SomeObject.bar = function(a, b) {
return {left: a-b, top: b-a};
};
SomeObject.magicalStuff = function(position) {
position.left = 0;
};
SomeObject.foo(100, 50);
L'uscita di questo è qualcosa di simile (a seconda del browser):
> Object
50
Se si espande il "oggetto" (in Chrome, Safari o Firefox (Firebug) quello che ottieni è:
> Object
left: 0
top: -50
Considerando che mi aspetto:
> Object
left: 50
top: -50
Quello che penso sta succedendo è che console.log() in realtà solo "messaggi", un riferimento alla console, che viene letta una volta che si fa clic sul simbolo "espandere". Ma questo tipo di sconfiggere lo scopo di console.log() non è uno strumento di debug? Mi sono sempre aspettato console.log() per "fare lo snapshot" del materiale che ho passato. È davvero sorprendente vedere un'istruzione che viene dopo che l'effettivo console.log() cambia l'output di quella stessa chiamata a console.log().
Oppure c'è qualcos'altro?
Modifica: Mi chiedo anche se ci sia un motivo valido per gli sviluppatori di browser per implementare console.log come questo (suppongo ce ne sia uno, altrimenti non sarebbe coerente nei principali browser).
Vedi https://bugs.webkit.org/show_bug.cgi?id=35801 –
@Roatin Marth: Capisco. Ma perché dicono: "Non possiamo clonare l'oggetto scaricandolo nella console". Quali sono le difficoltà tecniche che non riesco a vedere? :) – fresskoma
Questo è spesso visto quando si tenta di registrare un evento, poiché tutti gli eventi sono un singolo oggetto, di solito si sta guardando l'ultimo evento mousemove. –