是的,你可以。事實上,你有,你的實現完美工作: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");
我會建議使用功能聲明而不是功能表達,雖然:
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):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);
這個版本做了幾件事情:
允許您提供回調作爲參數傳遞給一箇中央decorate
功能。
允許您選擇提供調用回調時使用的「上下文」(this
值)。
當調用原始和(如果您不提供context
)回調時保留值this
。
...這在裝飾對象功能(有時稱爲方法)時很方便。
其實它的工作是這樣 – Natim