我可以解决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