Tak, możesz. I faktycznie masz, Twoja implementacja działa idealnie: 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");
Polecam przy użyciu funkcji deklaracji zamiast funkcji wyrażenia, choć:
function myfunction(foobar) {
alert(foobar);
}
function decorate(callback) {
return function(foobar) {
callback(foobar);
console.log(foobar);
};
}
var result = decorate(myfunction);
result("Hi there");
A jeśli chcesz stworzyć wersję bardziej ogólny, spójrz na użyciu apply
(MDN | spec) i pseudoelement arguments
(MDN || | 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);
Ta wersja ma kilka rzeczy:
pozwala dostarczyć zwrotnego jako argument do jednego centralnego decorate
funkcji.
Pozwala opcjonalnie podać wartość "context" (this
), która ma być używana podczas wywoływania tego wywołania zwrotnego.
Zachowuje wartość this
podczas wywoływania zarówno oryginału, jak i (jeśli nie dostarczasz context
) wywołania zwrotnego.
... które są przydatne podczas dekorowania funkcji obiektu (czasami nazywane metodami).
Właściwie to nie działa tak jak tego – Natim