我可以解決JavaScript部分。因爲你可以在JS(var fn = function(){/* stuff */};
)中聲明匿名函數,所以你也可以將這些函數作爲參數傳遞給其他函數,事實上,如果你需要做一個自定義的排序例程,那麼你已經使用了lambda表達式,例如:
// Standard sort:
x = [4,3,6,7,1,5,2];
x.sort();
// Custom sort:
y = [
{'val':4,'name':'four'},
{'val':3,'name':'three'},
{'val':6,'name':'six'},
{'val':7,'name':'seven'},
{'val':1,'name':'one'},
{'val':5,'name':'five'},
{'val':2,'name':'two'},
];
y.sort(function(a,b){ return a.val > b.val ? 1 : -1 });
replace()
是另一個例子,採取了lambda函數作爲參數。
在自己的代碼這樣做是很容易的,但實際上我從來沒有發現一個情況,當這不可能做到更清楚一些其他方式(如果其他人需要管理你的代碼,你必須打破他們的頭,直到他們看到拉姆達)
下面是一個示例。假設你有一個產生某種形式的輸出的對象Widget
。你知道它總是會產生輸出,但是你不知道輸出的結果是什麼。一種解決方案是將對象生成輸出所需的方法傳遞給對象。這裏有一個簡單的實現:
首先,Widget
本身。需要注意的是Widget.prototype.publish()
只有一個參數,這是你的自定義格式:
var Widget = function() {
var self = this;
var strPrivateVar = "This is a private variable";
self.publicVar = "This is a default public variable";
self.publish = function(f) {
var fnFormatter = f;
var strOutput = "The output is " + fnFormatter(self,strPrivateVar);
return strOutput;
}
};
接下來,你的格式化。一個簡要總結,而另一個給人的全文:
var fnSummary = function(o,s) {
var self = o;
var strPrivateVar = s;
return strPrivateVar.substr(0,5) + ' ' + self.publicVar.substr(0,5);
}
var fnDetails = function(o,s) {
var self = o;
var strPrivateVar = s;
return strPrivateVar + ' ' + self.publicVar;
}
而在去年,您的實現:
var wWidget = new Widget();
wWidget.publicVar = "I have overridden the public property";
var strSummary = wWidget.publish(fnSummary);
var strDetails = wWidget.publish(fnDetails);
console.log(strSummary,strDetails);
這種解決方案意味着你不需要改變wWidget
對象,以獲得所需輸出。由於範圍問題,您必須跳過一些環節才能將對象中的變量轉換爲發佈方法,但一旦完成了這些操作,其餘的操作就很容易了。
我知道還有其他人可以舉一個更好的例子,但我希望這可以幫助你。
您可能被命名嚇倒了。如果你知道數學中有什麼函數(比如x-> x^2),那麼你就已經瞭解了lambda。 – greenoldman 2010-09-15 06:50:45