2013-03-14 10 views
9

Quando provo a eseguire il debug di questo codice (http://jsfiddle.net/QWFGN/)La raccolta dati javascript di Chrome funziona in modo diverso?

var foo = (function(numb) { 
    return { 
     bar: function() { 
      debugger; 
      return "something"; 
     } 
    } 
})(1); 
foo.bar() 

Developer strumento in Chrome si comporta in modo diverso rispetto e Firebug in Firefox e strumento di sviluppo in IE. Il problema è che la variabile numbnon è visibile nello strumento per sviluppatori di Chrome sulla riga debugger;. Ma è visibile in Firebug e IE. Se provo a digitare numb nella console di Chrome ottengo:

ReferenceError: numb is not defined 

numb, naturalmente, è visibile in questa chiusura, e se cambio codice (http://jsfiddle.net/QWFGN/1/)

var foo = (function(numb) { 
    return { 
     bar: function() { 
      debugger; 
      console.log(numb); 
      return "something"; 
     } 
    } 
})(1); 
foo.bar() 

numb è ora visibile anche in Chrome e posso ottenere il valore 1 come risposta.

Quindi, la mia domanda è: Perché solo Google Chrome non vede le variabili di chiusura che non vengono mai utilizzate? Google Chrome ha la propria implementazione di Garbage Collection o è solo relativo all'implementazione dello strumento di debug in Google Chrome.

+0

possibile duplicato di [Informazioni sulla chiusura, LexicalEnvironment e GC] (http://stackoverflow.com/questions/8665781/about-closure-lexicalenvironment-and-gc) o [Come vengono rappresentate le chiusure e gli ambiti in fase di esecuzione in JavaScript ] (http://stackoverflow.com/questions/5368048/how-are-closures-and-scopes-represented-at-run-time-in-javascript) – Bergi

risposta

8

Questo non ha nulla a che fare con la garbage collection o gli strumenti di debug.

Che cosa sta accadendo in realtà è che il motore JS di Chrome si rende conto che non si utilizza mai numb all'interno della funzione, quindi non lo include affatto nella chiusura.

Nota che è possibile farlo solo se può provare che la funzione interna non utilizza mai with o chiama eval.

+2

Ciao, chiedi scusa per averlo chiesto, ma potresti aggiungere un link a qualche fonte ufficiale su questo? Sarebbe fantastico! – Sebas

+0

Ovviamente @SLaks ha ragione, è difficile individuare questo nella documentazione V8. Discussioni simili arrivano alla stessa conclusione -> http://comments.gmane.org/gmane.comp.lang.javascript.v8.general/678 –

+0

Thx for answer. Ecco alcuni riferimenti che ho trovato: http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-2-lexical-environments-ecmascript-implementation/#codeevalcode-and-inner-functions-may-break-optimizations, https : //twitter.com/erikcorry/status/53901976865476608. Se qualcuno trova il link alla documentazione V8 dove è specificato, lo apprezzerei molto. – dugokontov