2013-03-14 11 views
9

Kiedy próbuję debugować kod (http://jsfiddle.net/QWFGN/)Czy usuwanie elementów javascript w przeglądarce Chrome działa inaczej?

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

narzędzie dla programistów w Chrome zachowuje się inaczej niż Firefox i Firebug i narzędzia deweloperskiego w IE. Problem polega na tym, że zmienna numbnie jest widoczna w narzędziu programisty Chrome na linii debugger;. Jest jednak widoczny w Firebug i IE. Gdy próbuję wpisać numb w konsoli Chrome uzyskać:

ReferenceError: numb is not defined 

numb, oczywiście, jest widoczny w tym zamknięcia, a jeśli kod do (http://jsfiddle.net/QWFGN/1/)

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

numb jest teraz widoczny również w Chrome i jako odpowiedź mogę uzyskać wartość 1.

Moje pytanie brzmi: Dlaczego tylko Google Chrome nie widzi zmiennych zamknięcia, które nigdy nie są używane? Czy Google Chrome ma własną implementację Garbage Collection lub jest związany tylko z implementacją narzędzia do debugowania w przeglądarce Google Chrome.

+0

możliwy duplikat [O zamknięciu, środowisku leksykalnym i GC] (http://stackoverflow.com/questions/8665781/about-closure-lexicalenvironment-and-gc) lub [Jak są zamknięte i zakresy reprezentowane w czasie wykonywania w JavaScript ] (http://stackoverflow.com/questions/5368048/how-are-closures-and-scopes-represented-at-run-time-in-javascript) – Bergi

Odpowiedz

8

To nie ma nic wspólnego z czyszczeniem pamięci ani narzędziami do debugowania.

To, co się dzieje, to fakt, że silnik Chrome JS zdaje sobie sprawę, że nigdy nie używasz wewnątrz funkcji funkcji numb, więc w ogóle jej nie ma w zamknięciu.

Pamiętaj, że może to zrobić tylko, jeśli może udowodnić, że funkcja wewnętrzna nigdy nie używa with lub połączeń eval.

+2

Witam, przepraszam za pytanie, ale czy mógłbyś dodać link do jakiegoś oficjalnego źródła na ten temat? Byłoby świetnie! – Sebas

+0

Oczywiście @SLaks ma rację, trudno jest wskazać to w dokumentacji V8. Podobna dyskusja zbliża się do tego samego wniosku -> http://comments.gmane.org/gmane.comp.lang.javascript.v8.general/678 –

+0

Thx za odpowiedź. Oto kilka odnośników, które znalazłem: 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. Jeśli ktoś znajdzie link do dokumentacji V8, gdzie jest to określone, byłbym bardzo wdzięczny. – dugokontov