Есть ли хороший пример использования для angular.identity()?
Согласно документации
A function that returns its first argument. This function is useful when writing code in the functional style.
Мне интересно, где я могу найти хороший пример такого варианта использования - написать код в функциональном стиле в приложении angular.
Благодаря
Ответы
Ответ 1
Пример из исходного кода AngularJS:
function transformer(transformationFn, value) {
return (transformationFn || angular.identity)(value);
};
Пояснение:
В случае, если transformationFn
предоставляется в качестве первого параметра, он будет вызываться с value
в качестве собственного параметра. В противном случае функция identity
будет вызываться с тем же значением.
Как указывается исходный код ng:
Эта функция полезна при написании кода в функциональном стиле.
Это означает, что в функциональном программировании нет глобалов, поэтому вам всегда нужно передавать/вводить все, что вам нужно.
Ответ 2
Предположим, что у нас есть две следующие функции:
$scope.square = function(n) {
return n * n
};
$scope.multplybyTwo = function(n) {
return n * 2
};
Чтобы назвать это функциональным способом:
$scope.givemeResult = function(fn, val) {
return (fn || angular.identity)(val);
};
Затем вы можете использовать вышеуказанную функцию, как показано ниже:
$scope.initVal = 5;
$scope.squareResult = $scope.givemeResult($scope.square, $scope.initVal);
$scope.intoTwo = $scope.givemeResult($scope.multplybyTwo, $scope.initVal);
Вы можете перейти по следующей ссылке:
http://litutech.blogspot.in/2014/02/angularidentity-example.html
Ответ 3
Исправьте меня, если я ошибаюсь, но я понимаю, что это
function transformer(transformationFn, value) {
return (transformationFn || angular.identity)(value);
};
может быть "не рефакторирован" для этого
function transformer(transformationFn, value) {
if (transformationFn) {
return transformationFn(value);
} else {
return angular.identity(value);
}
};
который был бы функционально эквивалентен этой версии identity
-less:
function transformer(transformationFn, value) {
if (transformationFn) {
return transformationFn(value);
} else {
return value;
}
};
Итак, я предполагаю, что прецедент был бы применен, когда вы хотите применить определенное преобразование к значению, когда вам предоставляется то, что может или не может существовать на самом деле.
Я хотел лучше объяснить функцию identity
(как я ее понимаю), хотя, когда я просматриваю свой ответ, я не думаю, что я действительно ответил на ваш вопрос. Оставляя мой ответ здесь, в любом случае, если это будет полезно.
Ответ 4
angular.identity
полезен для случаев, когда вы хотите ссылаться на объект, связанный с родителем, передавая его от родителя к его дочерним элементам.
Функция идентичности подобна нулю для функций. Какой-то бесполезный сам по себе, но иногда полезный как часть выражения с использованием функций более высокого порядка, где вы можете взять функцию в качестве параметра или вернуть ее в результате.
Вот пример значений массива:
Например, вы можете привязать двумерный массив к первоначальному выбору, а затем привязать внутренние массивы к каждому подэлементу. Функция значений в этом случае является идентификационной функцией: она вызывается для каждой группы дочерних элементов, передается данные, привязанные к родительскому элементу, и возвращает этот массив данных.
Используйте его, когда необходимо передать фиктивную функцию:
- обещание ($ q)
- компилятор ($ compile)
- a unit test (шпион/макет)
который действует как источник данных или насос для фильтра трубы.
Для сравнения, Angular.noop
неправильно обрабатывает разрешение/отклонение promises правильно, потому что он всегда возвращает undefined, тогда как angular.identity
правильно обрабатывает разрешение/отклонение promises, потому что он всегда возвращает переданный ему аргумент (f(x) = x
).
В терминах конструкторов в Angular он имеет значение как таковое:
JavaScript-движки возвращают только экземпляр конструктора, если конструктор явно не возвращает объект (т.е. значение объекта или функции типа). Следовательно, новая идентичность (значение) всегда является объектом. Таким образом, новое значение identity (value) == возвращает только true, если значение является объектом. Это связано с тем, что операторы равенства в JavaScript всегда проверяют идентификатор, если один из операндов является объектом.
Ссылки