Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: JS Domknięcia i samo zwiększająca się funkcja.
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
mesmerro
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
wszerad
  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?
mortus
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.
mesmerro
wielkie dzięki, zmylono mnie gdyż powiedziano mi iż problem to domknięcie, bardzo dziękuje za sensowne wyjaśnienie.
wszerad
"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'
mesmerro
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ć.
wszerad
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!'
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.