はい、できます。実際、あなたの実装は完璧に動作します: ソース
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");
ただし、関数式ではなく関数宣言を使用することをお勧めします。
function myfunction(foobar) {
alert(foobar);
}
function decorate(callback) {
return function(foobar) {
callback(foobar);
console.log(foobar);
};
}
var result = decorate(myfunction);
result("Hi there");
より一般的なバージョンを作成したい場合は、apply
( MDN | spec ) とarguments
疑似配列 ( MDN | spec )の使用を見てください。ソース
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);
そのバージョンはいくつかのことを行います:
コールバックを引数として 1 つの中心的なdecorate
関数に提供できます。
this
オプションで、コールバックを呼び出すときに使用する「コンテキスト」(値) を指定できます。
this
元のコールバックと (指定しない場合) コールバックの両方を呼び出すときに、 の値を保持しcontext
ます。
...これは、オブジェクト関数 (メソッドと呼ばれることもあります) を装飾するときに便利です。