我在閱讀PrototypeJS的文檔時遇到了這個問題:Identity Function。我做了一些進一步的搜索&閱讀它,我想我理解它的數學基礎(例如乘以1是一個身份函數(或者我誤解了這個?)),但不是爲什麼你會寫一個JS(或PHP或C或其他) - 功能,基本上把X作爲參數,然後只是做一些像return X
。'身份函數'的目的是什麼?
有沒有更深的見解與此相關? Prototype爲什麼提供這個功能?我能用它做什麼?
謝謝:)
我在閱讀PrototypeJS的文檔時遇到了這個問題:Identity Function。我做了一些進一步的搜索&閱讀它,我想我理解它的數學基礎(例如乘以1是一個身份函數(或者我誤解了這個?)),但不是爲什麼你會寫一個JS(或PHP或C或其他) - 功能,基本上把X作爲參數,然後只是做一些像return X
。'身份函數'的目的是什麼?
有沒有更深的見解與此相關? Prototype爲什麼提供這個功能?我能用它做什麼?
謝謝:)
使用標識功能使庫代碼稍微容易閱讀。就拿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
,但它也可以讓你真正的檢查之前處理每一個元素:
$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();
},
我不知道該庫,但通常情況下,你通過分解共用部分進行,如if (add) (a + b) + x else a + b
應該被改寫成a + b + (add ? x : 0)
優化formuals或代碼或什麼的。你很想和
if (!initialized) initialize(callback_with_very_long_name) else callback_with_very_long_name
看起來很相似。你可以很容易地分解出一個共同的因素或術語,但我們如何分解出一個功能應用程序呢?如果你瞭解mathematiscs或Hascel,你應該看到
a ? x + v : v
看起來非常像
a ? f value : value
你在一個案例中添加X,但不是在其他。您在一個案例中應用功能,但在另一個案例中不應用。您將前者優化爲(a ? x : 0) + v
,因爲0是additive identity(它在添加到它時不會改變任何內容)並且v
是一個常見因素,無論application of x
如何,它始終是一個常見因素。在功能應用(或不應用)的情況下,回調是共同的因素。我們想把它分解出來。什麼是我們應該適用的身份功能,以便沒有任何變化?身份功能!
(a ? f : identity) value
是我們正在尋找。我們的原始示例如下所示
(initialized ? identity : initialize) (callback_with_very_long_name)
請注意,它現在可以放入一行頁。