2013-03-14 16 views

Odpowiedz

15

przykład z kodem źródłowym angularjs:

function transformer(transformationFn, value) { 
    return (transformationFn || angular.identity)(value); 
}; 

Objaśnienie:

W przypadku transformationFn jest dostarczany jako pierwszy parametr, zostanie ona wywołana z value jako swój własny parametr. W przeciwnym razie funkcja identity zostanie wywołana z tą samą wartością.

kod źródłowy Jak ng wspomina:

Funkcja ta jest przydatna podczas pisania kodu w stylu funkcjonalnym.

Oznacza to, że w programowaniu funkcjonalnym nie ma globali, więc zawsze musisz podać/wstrzyknąć wszystko, czego potrzebujesz.

+2

I nie rozumiem, dlaczego nazywamy angular.identity() '' funkcji (gdy transformationFn jest niezdefiniowany) i co robi na wywołanie. – mia

+2

Zasadniczo jest tu używana jako domyślna implementacja - gdy nie jest dostarczana żadna funkcja transformacji, po prostu wracamy do tożsamości (tj. Bez transformacji). –

9

Powiedzmy mamy te dwie poniższe funkcje:

$scope.square = function(n) { 
return n * n 
}; 


$scope.multplybyTwo = function(n) { 
return n * 2 
}; 

zadzwonić to w sposób funkcjonalny:

$scope.givemeResult = function(fn, val) { 
return (fn || angular.identity)(val); 
}; 

Następnie można użyć powyższej funkcji coś jak poniżej:

$scope.initVal = 5; 
$scope.squareResult = $scope.givemeResult($scope.square, $scope.initVal); 
$scope.intoTwo = $scope.givemeResult($scope.multplybyTwo, $scope.initVal); 

Możesz wykonać poniższy link:

http://litutech.blogspot.in/2014/02/angularidentity-example.html

+3

Witamy w Stack Exchange. To jest [strona z pytaniami i odpowiedziami] (http://stackoverflow.com/about), a nie kolekcja linków. W odpowiedzi podaj odpowiednią treść, a nie tylko link do miejsca, w którym może znajdować się treść. Łącze jest miłe, aby mieć dodatkowe referencje lub dodatkowe informacje. Aby uzyskać więcej wskazówek, zobacz [Jak odpowiedzieć] (http://stackoverflow.com/questions/how-to-answer). –

7

Popraw mnie jeśli się mylę, ale mój zrozumienia jest to, że

function transformer(transformationFn, value) { 
    return (transformationFn || angular.identity)(value); 
}; 

może być "un-refactored" do tej

function transformer(transformationFn, value) { 
    if (transformationFn) { 
    return transformationFn(value); 
    } else { 
    return angular.identity(value); 
    } 
}; 

co byłoby równoważne funkcjonalnie to identity -less wersja:

function transformer(transformationFn, value) { 
    if (transformationFn) { 
    return transformationFn(value); 
    } else { 
    return value; 
    } 
}; 

Sądzę więc, że przypadek użycia będzie wtedy, gdy chcesz zastosować pewną transformację do wartości, gdy otrzymasz coś, co może faktycznie istnieć.

Chciałem lepiej wyjaśnić funkcję identity (jak rozumiem), chociaż kiedy przeglądam swoją odpowiedź, nie sądzę, żebym naprawdę odpowiedział na twoje pytanie. Pozostawiając moją odpowiedź tutaj, na wszelki wypadek, jeśli jest to pomocne.

+0

Wyjaśnienie tego, co akrobatycznie robi przypadek. Dzięki! – Michiel

4

angular.identity jest przydatny w przypadkach, w których chcesz odwołać się do obiektu powiązanego z rodzicem, przekazując go od rodzica do jego dzieci.

Funkcja identyfikacji jest jak zero dla funkcji. Bezużyteczny sam w sobie, ale okazjonalnie przydatny jako część wyrażenia używającego funkcji wyższego rzędu, w którym można wziąć funkcję jako parametr lub zwrócić ją w wyniku.

Oto przykład dla wartości tablicy:

Na przykład, można powiązać z dwuwymiarową siatką na wstępnej selekcji, a następnie wiążą się z wewnętrzną zawartych tablice dla każdego Podzaznaczanie. W tym przypadku wartością jest funkcja tożsamości: jest ona wywoływana dla każdej grupy elementów podrzędnych, przekazywana jest do niej dane powiązane z elementem nadrzędnym i zwraca tę tablicę danych.

Użyj go, gdy jest to konieczne, aby przejść obojętne funkcję:

  • obietnicą ($ q)
  • kompilator ($ kompilacji)
  • test jednostka (szpieg/mock)

który działa jako źródło danych lub pompa do rury | filtru.

porównania Angular.noop nieprawidłowo obsługuje rozwiązywania/odrzucanie obietnic poprawnie, ponieważ zawsze zwraca niezdefiniowana, natomiast Angular.identity poprawnie obsługuje rozwiązywania/odrzucanie obietnic, ponieważ zawsze zwraca argument przekazany do niego (f(x) = x).

Pod względem konstruktorów w kątowa, istotne jest jako takie: silniki

JavaScript tylko zwrócić instancji konstruktora jeśli konstruktor nie wyraźnie zwraca obiekt (czyli wartość przedmiotu typu lub funkcjonować). Stąd nowa tożsamość (wartość) jest zawsze przedmiotem. Tak więc nowa tożsamość (wartość) == wartość zwraca tylko wartość true, jeśli wartość jest obiektem. Dzieje się tak, ponieważ operatory równości w kodzie JavaScript zawsze sprawdzają tożsamość, gdy jeden z argumentów jest obiektem.

Odniesienia

Powiązane problemy