Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript]dlaczego ta funkcja działa?
porzeczki
post 27.01.2017, 04:30:13
Post #1





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 15.09.2016
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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();
Go to the top of the page
+Quote Post
by_ikar
post 27.01.2017, 08:28:13
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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.

Ten post edytował by_ikar 27.01.2017, 08:29:21
Go to the top of the page
+Quote Post
porzeczki
post 27.01.2017, 17:10:34
Post #3





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 15.09.2016
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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?

Ten post edytował porzeczki 27.01.2017, 17:11:31
Go to the top of the page
+Quote Post
trueblue
post 27.01.2017, 18:08:14
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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();





--------------------
Go to the top of the page
+Quote Post
by_ikar
post 27.01.2017, 18:18:08
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
porzeczki
post 27.01.2017, 19:20:30
Post #6





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 15.09.2016
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.

Ten post edytował porzeczki 27.01.2017, 19:24:06
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.04.2024 - 21:02