Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> JS Domknięcia i samo zwiększająca się funkcja.
mesmerro
post 1.09.2011, 20:54:44
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 1.09.2011

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


Witam, próbuję załapać domknięcia w JS, o to problemik

Program który będzie wywoływany foo(); będzie "zliczał" ilość wywołań bez użycia zmiennej globalnej ani argumentu w funckji
więc jeśli wywołamy go foo(); foo(); alert(foo()); to da nam 3

i naskrobałem coś takiego
Kod
var increment = function() {
    var i = 0;
    return function() { return i += 1;}();
};

alert(increment()+" "+increment());

(tak wiem, że to się zeruję)

Póki co stoję poetycko to ujmując "jak widływ gnoju".
Wszelkie sugestie mile widziane
Go to the top of the page
+Quote Post
wszerad
post 1.09.2011, 21:46:50
Post #2





Grupa: Zarejestrowani
Postów: 106
Pomógł: 18
Dołączył: 11.12.2008

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


  1. var i = 0;
  2. (function(){
  3. //i == 0
  4. })()
  5. (function(){
  6. var i = 1;
  7. //i == 1
  8. })()
  9. //i == 0 (ciekawe nie:D)
  10. (function(){
  11. i = 2;
  12. //i == 2
  13. })()
  14. //i == 2

Taki zapis funkcji: (function(y){//y == x})(x) automatycznie ją wyzwala bez jej zapisywania.(pewnie ci się to przyda kiedyś)
Chyba rozwiałem wątpliwości w tym temacie?

Ten post edytował wszerad 1.09.2011, 21:47:44
Go to the top of the page
+Quote Post
mortus
post 1.09.2011, 21:59:20
Post #3





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Podstawą działania takich funkcji jest sposób ustalania początkowej wartości zmiennej (opiszę to dokładniej w kodzie poniżej). Po drugie nie rozumiem, co chcesz osiągnąć zwracając w swojej funkcji wynik działania jakiejś funkcji anonimowej, to raczej nie tędy droga. Problem z domknięciami ma niewiele wspólnego, chodzi tutaj raczej o zasymulowanie zmiennej statycznej w JS.
[JAVASCRIPT] pobierz, plaintext
  1. var increment = function() {
  2. // ustalamy pierwszą wartość naszej zmiennej
  3. // sprawdzając, czy jest niezdefiniowanego typu
  4. // kod jest wykonywany przy pierwszym wywołaniu funkcji increment
  5. if(typeof increment.i == 'undefined') {
  6. increment.i = 0;
  7. }
  8. return ++increment.i;
  9. };
  10. alert(increment()+" "+increment());
[JAVASCRIPT] pobierz, plaintext


@wszerad Nie chodzi o to, że taki zapis funkcję wyzwala, ale chodzi o to, że wewnątrz ciała tej funkcji mamy ograniczony zasięg zmiennych tylko do ciała tej funkcji. Powoduje to, że możemy bezpieczniej używać zmiennych do niej przekazanych.
Takie coś do poczytania, choć to niewiele, jeśli chodzi o domknięcia.

Ten post edytował mortus 1.09.2011, 22:00:33
Go to the top of the page
+Quote Post
mesmerro
post 1.09.2011, 22:13:32
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 1.09.2011

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


wielkie dzięki, zmylono mnie gdyż powiedziano mi iż problem to domknięcie, bardzo dziękuje za sensowne wyjaśnienie.
Go to the top of the page
+Quote Post
wszerad
post 1.09.2011, 22:24:09
Post #5





Grupa: Zarejestrowani
Postów: 106
Pomógł: 18
Dołączył: 11.12.2008

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


"Nie chodzi o to, że taki zapis funkcję wyzwala" to była tylko taka ciekawostka poza tematem:D
Troche lipnie, że this odwołuje się do obiektu globalnego zamiast do obiektu funkcji.

Dobra mam coś innego:
var a = function(){alert(arguments.callee.a);};
a.a = 'ok';
a(); -> 'ok'
Go to the top of the page
+Quote Post
mesmerro
post 1.09.2011, 22:40:23
Post #6





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 1.09.2011

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


a takie jeszcze pytanie do wywołania funkcji

function (){
return x}();

nawiasy końcowe są by automatycznie się wykonała, a po co wyżej podałeś tam x oraz co i poco tam podawać.
Go to the top of the page
+Quote Post
wszerad
post 1.09.2011, 23:19:01
Post #7





Grupa: Zarejestrowani
Postów: 106
Pomógł: 18
Dołączył: 11.12.2008

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


Musisz taką funkcje brać w nawias, deklaracja obiektu to jeszcze nie obiekt (podobnie jest z new Date() itp), kiedy zmiennej przypisujesz funkcje var foo = function(){} czy function foo(){} to wywołanie jej uzyskujesz przez foo(), tak samo jest tu, nawias na końcu to arrgumenty jakie przekazujesz do funkcji.
  1. (function(x){alert(x);})('witaj!') //wyswietli 'witaj!'
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: 12.06.2025 - 15:17