14

根据文档

A function that returns its first argument. This function is useful when writing code in the functional style.

我想知道在哪里可以找到这种用例的一个很好的例子——在 Angular 应用程序中以函数式风格编写代码。谢谢

4

4 回答 4

15

来自 AngularJS 源代码的示例:

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

解释:

如果transformationFn作为第一个参数提供,它将value作为它自己的参数调用。否则identity函数将以相同的值调用。

正如ng源代码提到的:

在以函数式风格编写代码时,此函数很有用。

这意味着在函数式编程中没有全局变量,所以你总是必须传递/注入你需要的一切。

于 2013-03-14T23:19:31.247 回答
9

假设我们有以下两个功能:

$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

于 2014-02-19T13:18:18.267 回答
7

如果我错了,请纠正我,但我的理解是

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功能(据我所知),尽管当我回顾我的答案时,我认为我并没有真正回答你的问题。无论如何都要在这里留下我的答案,以防万一。

于 2015-04-30T14:00:23.540 回答
4

angular.identity在您希望通过将对象从父对象传递给其子对象来引用绑定到父对象的情况下非常有用。

恒等函数就像函数的零。本身有点无用,但偶尔作为使用高阶函数的表达式的一部分很有用,您可以将函数作为参数或将其作为结果返回。

这是数组值的示例:

例如,您可以将二维数组绑定到初始选择,然后将包含的内部数组绑定到每个子选择。在这种情况下,values 函数是标识函数:它为每组子元素调用,传递绑定到父元素的数据,并返回这个数据数组。

当需要将虚拟函数传递给:

  • 一个承诺($q)
  • 编译器($compile)
  • 单元测试(间谍/模拟)

它充当管道的数据源或泵。

相比之下,Angular.noop正确处理解析/拒绝承诺是因为它总是返回未定义,而Angular.identity正确处理解析/拒绝承诺是因为它总是返回传递给它的参数(f(x) = x)。

就 Angular 中的构造函数而言,它是相关的:

如果构造函数没有显式返回对象(即类型对象或函数的值),JavaScript 引擎只会返回构造函数的实例。因此新的身份(值)始终是一个对象。因此 new identity(value) == value 只有在 value 是一个对象时才返回 true。这是因为当操作数之一是对象时,JavaScript 中的相等运算符总是检查身份。

参考

于 2015-10-02T14:54:06.213 回答