Wskaźnik na funkcję w JS

0

Hejka!

Ogólnie mamy tak:

var bar = function () { alert("A"); }
var foo = bar;
bar = function () { alert("B"); };
foo();

Pokazuje A

var bar = function () { alert("A"); }
var foo = function() { bar(); }
bar = function () { alert("B"); };
foo();

Pokazuje B

Czy jest możliwość jakoś zrobić wskaźnik na bar żeby nie musieć robić foo jako funkcji w której jest wywoływane bar()?

0

Chodzi Ci o callbacki?

0

Hmm sam nie wiem o co mi chodzi. O ile dobrze rozumiem, w pierwszym przypadku (A) jest to realizowane przez kopie funkcji, a w drugim przez domkniecie.
Kiedyś czytalem artykul w zwiazku z tym, tyle ze nie chodzilo o czystego js'a tylko o uzywanie w htmlu i podpinanie pod eventy i funkcje bez argumentów przy których trzeba szczegolnie uważać. Kojarzysz może o czym mówie?

0

Prawdę mówiąc, nie.
Może przedstaw jakiś bardziej opisowy przypadek niż kod powyżej.

0

wskaźniki są w C/C++, gdzie masz do czynienia bezpośrednio z adresami pamięci.
W JavaScript są natomiast referencje do funkcji.

Hmm sam nie wiem o co mi chodzi. O ile dobrze rozumiem, w pierwszym przypadku (A) jest to realizowane przez kopie funkcji, a w drugim przez domkniecie.

źle rozumiesz. Przypisywanie = funkcji odbywa się zawsze przez referencję (ew. przez kopie referencji, bo jeśli coś jest w tym przypadku kopiowane to referencja. Ale nie funkcja), a nie kopię. Bo zarówno foo jak i bar będą się odwoływały do tego samego obiektu funkcji (każda funkcja jest obiektem).

Domknięcia natomiast w ogóle tu nie ma.

Ponadto każda funkcja w JS jest obiektem. Więc możesz zrobić tak:

var foo = function () { alert("A"); }
var bar = function (whatever) { whatever() };
foo(bar);

http://jsfiddle.net/h7soo78h/

czyli przekazać funkcję w argumencie jako tzw. callback.

0
LukeJL napisał(a):

Domknięcia natomiast w ogóle tu nie ma.

W 2 wklejonym przeze mnie kodzie, jasno widzę domknięcie.

0

to źle widzisz ;)

jeśli chodzi o ten kod:

var bar = function () { alert("A"); }
var foo = function() { bar(); }
bar = function () { alert("B"); };
foo();


,
to w tej linii:

var foo = function() { bar(); }

nie ma domknięcia, a jedynie wywołanie funkcji.

w moim przykładzie:

var bar = function (whatever) { whatever() };

też nie ma domknięcia, a jedynie wywołanie funkcji whatever przekazanej w argumencie.

domknięcie by było, gdyby funkcja była definiowana w funkcji:

var bar = function () { 
    var animal = 'elephant'
    function foo() {
         alert(animal); // elephant
    }
    foo();
}

http://jsfiddle.net/L418b83b/
co ma taką zaletę, że wewnętrzna funkcja foo widzi zmienne z zewnętrznej bar.

nawet wtedy kiedy funkcja bar już zakonczy działanie:

var bar = function () { 
    var animal = 'elephant'
    function foo() {
         alert(animal); // elephant
    }
    return foo;
};

var baz = bar();
baz(); // wywoluje to co zwrocila funkcja bar. A funkcja bar zwrocila funkcję foo. A foo odpala alert ze zmienną animal. Czyli: elephant :)

http://jsfiddle.net/czjtyprk/

0

Dzięki!

A kojarzysz może to o czym wspominałem z podpinaniem funkcji pod eventy w html? Gdzieś czytałem, że należy na coś uważać, i właśnie chyba chodziło o zamknięcie wywołania funkcji w innej funkcji. I zwłaszcza trzeba bylo uważać na bezargumentowe funkcje. Czytałem to jak jeszcze nie robiłem nic w JS i teraz nie daje mi to spokoju.

1 użytkowników online, w tym zalogowanych: 0, gości: 1