2013-01-08 13 views

Odpowiedz

9

Zasadniczo jest to funkcja bezczynności. Zwraca wartość tego, co zostało do niej przekazane.

Część o tym, że jest używana jako "domyślny iterator" w samej bibliotece oznacza, że ​​w innych funkcjach może mieć opcjonalny parametr "iterator" (który jest prawdopodobnie używany jako funkcja do zastosowania do każdego elementu tablicy pewnego rodzaju), jeśli nie zostanie przekazany żaden parametr iteratora, biblioteka użyje zamiast tego iteratora "no-op", a elementy tablicy pozostaną niezmienione.

+4

Tylko dla dobra: Możesz zobaczyć ten numer w [oznaczonym źródle] (http://underscorejs.org/docs/underscore.html#section-118). –

+0

@DanLee, Nie mogę oznaczyć komentarza jako odpowiedzi. – SunnyShah

+0

@SunnyShah To nie moja odpowiedź, tylko mój komentarz. Myślę, że możesz oznaczyć odpowiedź z Mattem za kilka minut. –

9

Konkretny przykład:

underscore.js określa _.each i jako taki.

_.each = function(obj, iterator, context) { 
    ... 
} 

Ten iterator pokazuje wartość el. Być może używałeś tego idiomu.

_.each([1, 2, 3], function(el){ 
    console.log(el); 
}); 

Ten iterator zwraca wartość el bez zmian.

_.each([1, 2, 3], function(el){ 
    return el; 
}); 

Funkcja, która zwraca wartość bez zmian, występuje często. Więc Underscore.js chce zdefiniować funkcję. Underscore.js nazywa funkcję _.identity.

_.identity = function(value) { 
    return value; 
}; 

Jeśli underscore.js chce użyć domyślny iterator, wszystkie underscore.js potrzebne jest wywołanie _.identity.

_.each([1, 2, 3], _.identity); 
+0

Stosując _.each jedynie powrócić co nie sugeruje się, to co _.map jest: '_.map ([1, 2, 3] funkcji (el) { powrotny El; }); ' Dobrze jest zasygnalizować swoje intencje kodem. Analogiczny JavaScript dla AnyCom i mapą są lepiej oddzielone, ponieważ forEach nie zbiera wyników funkcji, nawet jeśli znajduje się w nich instrukcja return. –

28

Wzór kodu JavaScript obejmujący tożsamość polega na filtrowaniu wartości na podstawie prawdy, np.

var a = [null, null, [1,2,3], null, [10, 12], null]; 

a.filter(_.identity) 

plony [Tablica [3], Tablica [2]].

Stosując

_.compact(a) 

jest wyraźniejsze, ale nie można wykorzystać lodash lub podkreślenia w ogóle, na przykład

function identity(x) { 
    return x; 
} 

a.filter(identity) 

To, czy jest to dobry wzór kodu, jest wątpliwe z kilku powodów, ale jest używane w środowisku naturalnym.

To wcale nie jest NOOP. NOOP jest imperatywną konstrukcją w np. montaż, podczas gdy w programowaniu funkcjonalnym jest to podobne do innych funkcji, ponieważ zwraca wartość. Jeśli tożsamość byłaby NOOP, wtedy wszystkie czyste funkcje mogłyby być również uważane za odbiór i nie byłoby to rozsądne.

Powiązane problemy