Powiedzmy, że zaczynam var dla Object w moim kodzie

var base = {x:Infinity, y:Infinity};

A później w tym samym zakresie

var base = {x:0, y:0}

Dostaję, że mogę ponownie wykorzystać istniejącą zmienną, ale próbuję iterować w punkcie .

  1. Czy to powoduje jakiekolwiek problemy z obecnym zakresem, jeśli chodzi o pamięć?
  2. Czy byłyby jakieś problemy, jeśli są w różnych zakresach?
  3. Czy ogólna zasada nigdy nie używa VaR na już istniejącą zmienną?
  4. Gdybym zrobił to kilka (tysiące) razy, czy wpadam w jakieś "funky" problemy?
7
Jacksonkr 6 grudzień 2011, 01:11

3 odpowiedzi

Najlepsza odpowiedź
  1. Uwalnia jego utrzymywanie starej wartości, więc może być zebrane potencjalnie śmieci. Mówię potencjalnie, ponieważ obiekty można odwoływać różne zmienne.

  2. Jeśli są w różnych zakresach, wewnętrzny base będzie cień zewnętrzny (zakładając, że mówisz o zagnieżdżonych zakresach), więc stara wartość nie zostanie nadpisana. Shadowing zazwyczaj najlepiej unikać.

  3. Ogólnie rzecz biorąc, w tym samym zakresie, tak, ale to więcej aspektu stylu kodowania. Nie dokonuje skutecznej różnicy w wykonaniu, ponieważ jest tylko jedna deklaracja bez względu na to, ile razy deklarujesz to samo var w tym samym zakresie.

  4. Zależy. Mówisz o nadpisywaniu w pętli? Jeśli nie potrzebujesz już bieżącej wartości, nie powinno być problemem.


Aby być jasnym, kiedy to robisz:

var base = {x:Infinity, y:Infinity};

var base = {x:0, y:0}

Tak się dzieje, to:

var base;  // declaration is hoisted

base = {x:Infinity, y:Infinity};  // new object is referenced by base

base = {x:0, y:0}  // previous object is released, and new object is referenced

Zauważ, że kiedy mówię o zakresie i var, mówię specjalnie o zakresie funkcji. W standardowych implementacjach JavaScript / ECMAScript nie ma zakresu bloków, więc nie ma specjalnego znaczenia podczas korzystania z var w oświadczeniu for na przykład.

Jak wspomniano przez @charles Bailey, Mozilla ma let, co pozwala na rzuceniem bloków, ale to wymagałoby tego konkretnego słowa kluczowego. Oświadczenie var nie rozpoznaje bloku względem zakresu zmiennego.

7
Community 23 maj 2017, 11:55

Nie ma absolutnie żadnego problemu. Przyszłość, variables zadeklarowany w funkcji (-Context) są częścią takiej nazwy {X1}} (ES Edition 3). Jest trochę inny inny w ES5, ale dla tej części jest zasadniczo taki sam.

Po prostu nadpisujesz nieruchomość, w obiekcie (nie jest obiektem javascript, ale z leżącego silnika JS).

Tak więc w ogóle nie jest to problem (nawet jeśli jego niezwykłe i wygląda do mylącego).

Jeśli zadeklaruj zmienną w innym "zakresie" (co zasadniczo oznacza, inna funkcja tutaj), nie ma też problemu. Każda kontekst (wykonania) jest całkowicie samodzielna i nie może zakłócać innym kontekstem, chyba że mówimy o zamknięciach i rzeczach. Ale nawet wtedy, jeśli masz kilka funkcji i kontekstu nadrzędnego, który ma tę samą nazwę zmienną, proces wyszukiwania (rozdzielczość nazwy) zawsze zaczyna się w lokalnym zakresie (obiekt aktywacyjny z bieżącego kontekstu), a potem trafia do "Łańcuch zasięgu".

Myślę, że powinna odpowiedzieć 3.) i 4.). "Może" ponownie zmienić zmienną, ale nie ma sensu. Więc polecam, żeby już tego nie robić.

1
jAndy 5 grudzień 2011, 21:17

Ogólna zasada jest jedną deklaracją var na funkcję, a deklaracja var należy do góry funkcji:

function foo() {
  var bar;
}

Powodem tego jest uniknięcie zamieszania, które mogłyby być spowodowane zmiennym podnoszeniem.

Przykład tego, w którym sprawy są z kontekstem zamknięcia w celu wywołania zwrotnego:

//this looks like it will count up, but it wont
function foo() {
  var i;
  for (i = 0; i < 10; i++) {
    var bar = i;
    setTimeout( function () {
      console.log(bar);
    }, 1000 * i);
  }
}

//this is actually what's happening behind the scenes
//hopefully you can see why it wont work
function foo() {
  var i, bar;
  for (i = 0; i < 10; i++) {
    bar = i; //bar is in the same scope as i
    setTimeout( function () {
      //when this is called `i` and `bar` will both have a value of 9
      console.log(bar);
    }, 1000 * i);
  }
}

Jeśli masz podrzędną funkcję, możesz zadeklarować nową zmienną o tej samej nazwie, która pozostanie do zakresu tej sub-funkcji:

function foo() {
  var bar;
  function baz() {
    bar = 2;
  }
  bar = 1;
  baz();
  console.log(bar); //output will be 2 because baz operated in the outer scope
}


function foo() {
  var bar;
  function baz() {
    var bar;
    bar = 2;
  }
  bar = 1;
  baz();
  console.log(bar); //output will stay 1 because baz operated in its own scope
}

Jeśli twój przykład kod jest wzdłuż linii:

function foo() {
  var base = {x:Infinity, y:Infinity};
  ...some code...
  var base = {x:0, y:0};
}

Rzeczywiście wykonuje:

function foo() {
  var base;
  base = {x:Infinity, y:Infinity};
  ...some code...
  base = {x:0, y:0};
}
0
zzzzBov 5 grudzień 2011, 22:05