Do czego służy zmienna przechowująca funkcję, która zawiera kod natywny?

0

Odpaliłem sobie po prostu najnowsze jquery. Mam na myśli kod i jest w nim coś takiego:

var arr = [];
var slice = arr.slice;
  1. Nie rozumiem czemu slice zamiast slice().
  2. Nie mogę znaleźć w dokumentacji czegoś takiego jak właściwosć slice;
  3. Doczytałem, że zmienna slice przechowuje kod natywny, który wykonywany jest na procesorze oraz jest implementowany przez samą przeglądarkę.
    Czy ktoś wie o co chodzi?
    Edit: oops sory, zmienna slice przechowuje chyba funkcję, w której znajduje się kod natywny. Odpaliłem console.log po prostu. Ale to nie zmienia tego, że dalej nie wiem o co chodzi.
1

Nie rozumiem czemu slice zamiast slice().

Ciężko stwierdzić bez szerszego kontekstu.

Nie mogę znaleźć w dokumentacji czegoś takiego jak właściwosć slice;

Istnieje metoda slice, zatem arr.slice jest niejako referencją do tej metody - na podobnej zasadzie jak tu:

function something() {
  /* ... */
}

const something2 = something;
something2();

Doczytałem, że zmienna slice przechowuje kod natywny, który wykonywany jest na procesorze oraz jest implementowany przez samą przeglądarkę. Czy ktoś wie o co chodzi?

Brzmi na krzywo przetłumaczony tekst (np. każdy kod jest ostatecznie wykonywany na procesorze, nie ma nic specjalnego w .slice()) - mógłbyś podesłać oryginalne źródło?

0

LINK do odpowiedzi na stackoverflow.
Mam na myśli trzeci punkt odpowiedzi.

0

Okej, już rozumiem czym jest referencja do funkcji, ale po co właściwie tę referencję się stosuje? Tzn. po co mi zmienna, która przechowuję definicję funkcji?

0

Bo funkcje są takimi samymi wartościami jak liczby czy napisy. Dzięki temu można je przekazywać jako argumenty, zwracać czy co tam się podoba.

0

@Saalin: Czyli chodzi po prostu o to, że czasem zachodzi potrzeba przekazania samej definicji funkcji do konkretnego miejsca. No dobrze, tylko teraz nie jestem pewny czy w jquery referencja slice jest referencją do tablicowej metody slice() czy referencją do funkcji slice zdefiniowanej w jquery.
Bo tam jest coś takiego:

slice: function() {
		return this.pushStack( slice.apply( this, arguments ) );
	}

Edit:
sprawdziłem i doczytałem. Ten kod slice to osobna metoda dodana poprzez prototypowanie. Ona nie ma nic wspólnego z metodą tablicową slice. Chyba, że coś pomieszałem.

0

A to dość ciekawe jest. Dałem taki kod i po 3 sekundach wyświetla mi alert hello.

function SL(){

    }
    var arr = [];
    var slice = arr.slice;
   
    SL.prototype = {
        slice:function() {
            alert("Hello");
        }
    }
    setTimeout(SL.prototype.slice,3000);

Ale gdy daję tak:

function SL(){

    }
    var arr = [];
    var slice = arr.slice;
   
    SL.prototype = {
        slice:function() {
            return "hello";
        }
    }
    var hello = setTimeout(SL.prototype.slice,3000);
    console.log(hello);

... to wtedy w konsoli wyświetla wartość 1. Szukałem w dokumentacji, że może są sytuacje, gdy setTimout zwraca wartość 1, ale nie znalazłem. Wiecie może o co chodzi?

0

po co właściwie tę referencję się stosuje?

Jak przypuszczam, jQuery nadpisuje .slice() jakimś własnym wrapperem - dzięki uruchomieniu na samym początku skryptu var arr = []; var slice = arr.slice;, jQuery może uzyskać dostęp do oryginalnego, jeszcze na tamten moment nienadpisanego .slice.

Nie jestem pewien czy jest to jakiś rodzaj optymalizacji czy może bugfixu.

Szukałem w dokumentacji, że może są sytuacje, gdy setTimout zwraca wartość 1, ale nie znalazłem. Wiecie może o co chodzi?

setTimeout() zwraca indeks utworzonego timera - ten indeks możesz przekazać do clearTimeout(), aby dany timer anulować.

0

Kurcze, faktycznie ... ;-) Co zaś odnośnie setTimeout(), zastanawiam się jak z opóźnieniem 3 sekundowym wyświetlić zwykłą liczbę. Bo alert wyświetla po 3 sekundach, to czemu nie liczbę? a zamiast owej liczby wyświetla właśnie ten index?

0

No chodzi po prostu o to, że wynikiem tego kodu jest jedynka wyświetlona od razu, a nie słowo hello wyświetlone po 3 sekundach. Pytanie brzmi -> czemu?:

function SL(){

    }
    var arr = [];
    var slice = arr.slice;

    SL.prototype = {
        slice:function() {
            return "hello";
        }
    }
    var hello = setTimeout(SL.prototype.slice,3000);
    console.log(hello);
0

W którym momencie próbujesz wyświetlić hello?

Z tego co widzę, masz tam funkcję, która zwraca "hello", a nie wyświetla ten ciąg znaków.

0

@Patryk27: Tak tak już już ... masz rację, rzeczywiście;-)

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