Sí, puedes. Y de hecho, usted tiene, su implementación funciona perfectamente: Live example | source
var myfunction = function(foobar) { alert(foobar); };
var decorate = function(callback) { return function(foobar) { callback(foobar); console.log(foobar); }; };
var result = decorate(myfunction);
result("Hi there");
recomendaría función utilizando declaraciones en lugar de la función expresiones, sin embargo:
function myfunction(foobar) {
alert(foobar);
}
function decorate(callback) {
return function(foobar) {
callback(foobar);
console.log(foobar);
};
}
var result = decorate(myfunction);
result("Hi there");
Y si desea crear una versión más genérica, buscar en el uso apply
(MDN | spec) y la pseudo-matriz arguments
(MDN | spec): Live example | source
function decorate(original, wrapper, context) {
return function() {
try {
original.apply(this, arguments);
}
catch (e) {
}
try {
wrapper.apply(context || this, arguments);
}
catch (e) {
}
};
}
function myFunction(arg1, arg2) {
alert("arg1 = " + arg1 + ", arg2 = " + arg2);
}
var newFunction = decorate(myFunction, function(arg1, arg2) {
console.log("arg1 = " + arg1 + ", arg2 = " + arg2);
});
newFunction(1, 2);
Esa versión hace un par de cosas:
permite proporcionar la devolución de llamada como un argumento a una función central decorate
.
Le permite opcionalmente suministrar un "contexto" (valor this
) para utilizar al llamar a la devolución de llamada.
Conserva el valor de this
cuando llama al original y (si no proporciona context
) la devolución de llamada.
... que es útil cuando se decoran funciones de objeto (a veces llamadas métodos).
En realidad no funciona así – Natim