“身份功能”的目的是什么?

时间:2009-08-19 09:03:23

标签: prototypejs

当我阅读PrototypeJS的文档时,我遇到了这个主题:Identity Function。我做了一些进一步的搜索和阅读,我认为我理解它的数学基础(例如乘以1是一个身份函数(或者我误解了这个?)),但不是为什么你会写一个JS(或PHP或C或其他)函数,它基本上将X作为参数,然后执行类似return X的操作。

是否有更深入的见解与此相关?为什么Prototype提供这个功能?我可以用它做什么?

谢谢:)

2 个答案:

答案 0 :(得分:7)

使用Identity功能使库代码更容易阅读。采用Enumerable#any方法:

  any: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var result = false;
    this.each(function(value, index) {
      if (result = !!iterator.call(context, value, index))
        throw $break;
    });
    return result;
  },

它允许您检查数组中的任何元素是否在布尔上下文中为真。像这样:

$A([true, false, true]).any() == true

但它也允许您在检查true之前处理每个元素:

$A([1,2,3,4]).any(function(e) { return e > 2; }) == true

现在没有身份功能,你必须编写任何功能的两个版本,一个是你预先处理的,另一个是你没有。

  any_no_process: function(iterator, context) {
    var result = false;
    this.each(function(value, index) {
      if (value)
        throw $break;
    });
    return result;
  },

  any_process: function(iterator, context) {
    return this.map(iterator).any();
  },

答案 1 :(得分:0)

我不知道该库,但通常情况下,您可以通过考虑公共部分来优化表格或代码或其他内容,例如if (add) (a + b) + x else a + b应该重写为a + b + (add ? x : 0)。你很想用

做同样的事情
if (!initialized) initialize(callback_with_very_long_name) else callback_with_very_long_name

看起来非常相似。您可以轻松地分解出一个共同的因素或术语,但我们如何分解出一个函数应用程序呢?如果您了解mathiscs或Hascel,您应该看到

a ? x + v : v

非常像

a ? f value : value

您在一个案例中添加x而在另一个案例中不添加。您在一个案例中应用函数,但在另一个案例中不应用。您将前者优化为(a ? x : 0) + v,因为0是additive identity(添加时它不会改变任何内容)而v是一个常见因素,无论{{1 }}。在函数应用程序(或非应用程序)的情况下,回调是公共因素。我们想要考虑它。什么是我们应该应用的身份函数,以便没有任何变化?身份功能!

application of x

是我们正在寻找的。我们的原始示例如下所示

(a ? f : identity) value

请注意,它现在适合一行页面。