Я могу обратиться к части JavaScript.Поскольку вы можете объявлять анонимные функции в JS (var fn = function(){/* stuff */};
, вы также можете передавать эти функции в качестве параметров другим функциям. Фактически, вы уже использовали лямбда-выражения, если вам когда-либо приходилось выполнять собственную процедуру сортировки. Например:
// 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()
- это еще один пример, который принимает лямбда-функции в качестве параметров.
Сделать это в своем собственном коде довольно легко, хотя на практике я никогда не находил обстоятельства, когда это не могло бы быть более четко другим способом (если кому-то еще нужно управлять вашим кодом, вы гарантированно сломаете голову, пока не увидите лямбду).
Вот пример. Скажему вас есть объект 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
объект, чтобы получить желаемый результат.Из-за проблем с областями видимости вам нужно перепрыгнуть через некоторые обручи, чтобы получить переменные из объекта в методы издателя, но как только вы это сделаете, все остальное просто.
Я знаю, что есть другие на SO, которые могли быприведите лучший пример, но я надеюсь, что это поможет вам.