2013-06-03 16 views

Odpowiedz

21

Jest to sposób krzyżowej przeglądarki umożliwiający przekazywanie dodatkowych argumentów, które będą wyświetlane jako argumenty wywołania zwrotnego, takie jak setTimeout(). To nie działa w IE.

To może uczynić kod ładniejsza ...

setTimeout(_.bind(function() { }, null, "arg1"), 1e3); 

... vs ...

_.delay(function() { }, 1e3, "arg1"); 

Zgadzam się, że jest to jeden z mniej przydatnych metod podkreślenia, które zostały przedstawione w Naomi's answer.

+1

Internet Explorer nie obsługuje [argumentów wywołania zwrotnego] (https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout#Callback_arguments). Co za b ****! –

+0

@ Alex-nie obsługuje przekazywania literału ciągu jako pierwszego parametru, więc nie * to * przeglądarka. Być może jest to wspomniane w dokumentacji ... – RobG

+0

@RobG Cóż, nie sądzę, że jest to funkcja, którą chcemy zachować :) – alex

4

Niewiele, mimo że pasuje tematycznie do: defer, debounce i tak dalej. Oznacza to, że można użyć notacji owijania podkreślenia:

_(yourfunction).delay(1000); 

Także to nie wygląda to pozwolić uciec z argumentem ciąg, który nazywamy eval.

+2

Nie sądzę, aby ktokolwiek przy zdrowych zmysłach przekazywał ciąg do 'setTimeout'. –

+0

@ plynx - niekoniecznie * eval *, może zamiast tego użyć konstruktora Function. ;-) @ Aadit - nie jest trudno obsłużyć łańcuchy, po prostu przetestuj pierwszy argument, a jeśli jest to ciąg, użyj konstruktora Function, a następnie wywołaj z nim ustawiony limit czasu. – RobG

+0

@AaditMShah robg Oboje wydajecie się mnie nie rozumieć - mówię o korzyściach z nieprzyjmowania argumentów ciągów. Widziałem to zdarzać się wiele razy, a czasami nawet przez przypadek. Możesz znaleźć wiele przykładów w kodzie tutaj na StackOverflow. Ręce programisty są dziwnymi rzeczami, a czasem umieszczają cytaty wokół rzeczy, kiedy nie patrzysz. – Plynx

11

Dlaczego funkcja Underscore.js ma funkcję opóźnienia?

Bo głupi. Ta konkretna metoda underscore.js wydaje się dość głupia.

Wady

  1. dodatkowa funkcja lib oznacza zasadę większy kod
  2. większy kod podstawowy znaczy dla utrzymywania więcej ewentualnych błędów
  3. kod, który wykorzystuje funkcję ma teraz zależność tej lib
  4. Mniejsza poprawa w stosunku do natywnego interfejsu API oznacza niski koszt: współczynnik wzmocnienia
  5. nowy apis do nauki

Plusy

sekcja ta celowo pozostawiona pusta


Chciałbym po prostu nauczyć się korzystać z javascript i zrobić coś jak

var hello = function() { 
    console.log("hello"); 
}; 

var delay = 1000; 

window.setTimeout(hello, delay); 

Proste, prawda? Underscore.js jest czasami całkiem bezużyteczny. Szczerze mówiąc, window.setTimeout jest całkowicie użyteczny, tak jak jest.


Oto kolejny przykład, aby pokazać jak przekazać argumentu do funkcji

var Cat = function(name) { 
    function meow(message) { 
    console.log(name, "says meow!", message); 
    } 
    this.meow = meow; 
}; 

var duchess = new Cat("Duchess"); 

window.setTimeout(duchess.meow.bind(duchess, "please feed me!"), 2000); 

// 2 seconds later 
// => Duchess says meow! please feed me! 

Jeśli nie może zależeć od .bind można wykorzystać zamknięcie zbyt

window.setTimeout(function() { 
    duchess.meow("please feed me!"); 
}, 1000); 

Wow, to było trudne. Wracam do podkreślenia i odkładania i jquery. Te rzeczy JavaScript są trudne!

+5

Rozumiem twoje podejście, ale gdy już zejdziesz z drogi do biblioteki ogólnej, wkrótce odkryjesz, że wszystko pakujesz, aby nie ujawnić podstawowego API (np. JQuery owija wszystko pod słońcem). W przeciwnym razie użytkownicy zaczynają się mylić, co to jest biblioteka i co jest rodzimym JS lub DOM lub cokolwiek abstrakcyjnego. Nie popierając jednego podejścia do drugiego, po prostu mówiąc. – RobG

+3

Kilka noobów wciąż głosujących na to. Trzymajcie ich, nowicjuszki :) – naomik

+1

Nie rozumiem całej nienawiści. Nie zasługujesz na obniżenie oceny. –

9

AES · thet · ics

Autor tej biblioteki, którzy zdecydowali się wydać jego/jej wolny czas, aby otworzyć źródło go, mówić o nim, używać go jako sposób na wprowadzenie ludzi do JavaScript i może dostać ktoś, kto miał chwilę świetlną wokół zakresu zamknięcia, myślał, że atrakcyjność biblioteki została zwiększona dzięki temu.

Argumenty o trafności tej funkcji w oderwaniu są jak twierdzenie o trafności obrazu lub innego rzemiosła. Niektórzy mogą to lubić, inni nie.

Możesz to lubić, czy nie. Ja osobiście preferuję biblioteki "just-get-to-the-point".

_.delay, _.defer, _.throttle, _.after mają przepływową IMHO, która czyta lepiej niż okno.

Na dodatek lubię również pisać strony serwera węzłów (nodejs) i nie muszę przełączać/włączać/wyłączać trybu ... spróbuj użyć window.timeout w węźle i zobacz, co się stanie.

Powiązane problemy