Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]dlaczego ta funkcja działa?
Forum PHP.pl > Forum > Przedszkole
porzeczki
dlaczego każde wywołanie add() nie zeruje zmiennej counter?

  1. var add = (function () {
  2. var counter = 0;
  3. return function () {return counter += 1;}
  4. })();
  5.  
  6. add();
  7. add();
  8. add();
by_ikar
Bo użyłeś samo-wykonującej się funkcji która stworzyła scope i ustawiła w tym scopie zmienną która później jest inkrementowana: http://imgur.com/7jNfTQ5

EDIT: stworzyłeś swego rodzaju prywatną zmienną, ale z racji że funkcja się wykonała sama, została zainicjalizowana tylko raz dzięki czemu scope wciąż istnieje i posiada wcześniej przypisane wartości.
porzeczki
czyli scope nie jest zdjęciem zmiennej (z linii nr2) z momentu likwidowania zewnętrznej funkcji, tylko nową zmienną z tą samą nazwą z początkowo przypisaną wartością z momentu likwidowania zewnętrznej funkcji. e?
trueblue
Cytat(porzeczki @ 27.01.2017, 17:10:34 ) *
czyli scope nie jest zdjęciem zmiennej (z linii nr2) z momentu likwidowania zewnętrznej funkcji, tylko nową zmienną z tą samą nazwą z początkowo przypisaną wartością z momentu likwidowania zewnętrznej funkcji. e?

Cokolwiek by to nie znaczyło...
Zmienna jest deklarowana przy każdym wywołaniu funkcji na nowo. Pomimo nazwy jest to inna zmienna, bo jest deklarowana w ciele funkcji.
Możesz użyć zmiennej globalnej, albo jakiejkolwiek zadeklarowanej poza ciałem ten funkcji (w wyższym scope) lub użyć czegoś w rodzaju zmiennej statycznej:
  1. function add() {
  2. if (typeof add.counter === 'undefined') {
  3. add.counter = 0;
  4. } else {
  5. add.counter++;
  6. }
  7. console.log(add.counter);
  8. };
  9.  
  10.  
  11. add();
  12. add();



by_ikar
Scope jest wszystkim pomiędzy klamrami. Dlatego w moim poprzednim screenie rozwinąłem sekcje [[Scopes]] w której znajduje się counter z przypisaną mu wartością. Wyobraź to sobie tak. W gobal scope możesz sobie zdefiniować zmienną która ci nie znika, tutaj ma miejsce podobna sytuacja, stworzyłeś sobie taką przestrzeń i przypisałeś ją do zmiennej. Wówczas w pamięci zostaje ta zmienna która jest później wykorzystywana, do czasu aż wszystkie jej odwołania nie zostaną usunięte lub garbage collector tego nie usunie.
porzeczki
ok. W poprzednim pytaniu:
Cytat
czyli scope nie jest zdjęciem zmiennej (z linii nr2) z momentu likwidowania zewnętrznej funkcji, tylko nową zmienną z tą samą nazwą z początkowo przypisaną wartością z momentu likwidowania zewnętrznej funkcji. e?

chodziło mi o to że...(o tym na końcu)
Z tego przykładu o closure:
  1. function stopWatch() {
  2. var startTime = Date.now();
  3.  
  4. function getDelay() {
  5. var elapsedTime = Date.now() - startTime;
  6. alert(elapsedTime);
  7. }
  8.  
  9. return getDelay;
  10. }
  11.  
  12. var timer = stopWatch();


jest obrazek



z którego można rozumieć, że do scope jest przenoszona zmienna z linii nr 2 razem z jej wartością, i że kolejne wywołania getDelay() odnoszą się do tej zmiennej.
Dlatego w pytaniu chodziło mi o to czy scope przechowuje zdjęcie (fotografię) tej zmiennej.

Ale już rozumiem, że w scope jest nowa, z tą samą nazwą, prywatna zmienna, którą można modyfikować i która zostaje w pamięci.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.