8

私がやりたいことは次のとおりです。

私は何かを警告する機能を持っています:

myfunction = function(foobar) { 
                 alert(foobar); 
             };

今、私はそれを次のように飾りたいです:

decorate = function(callback) { 
              return function(foobar) { 
                  callback(foobar); 
                  console.log(foobar); 
           }; 
};

だから私は書くことができます:

myfunction = decorate(myfunction);

そして、myfunction はコンソールで通常の + ログを実行します。

Javascript で動作させるにはどうすればよいですか?

4

2 に答える 2

10

はい、できます。実際、あなたの実装は完璧に動作します: ソース

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. コールバックを引数として 1 つの中心的なdecorate関数に提供できます。

  2. thisオプションで、コールバックを呼び出すときに使用する「コンテキスト」(値) を指定できます。

  3. this元のコールバックと (指定しない場合) コールバックの両方を呼び出すときに、 の値を保持しcontextます。

...これは、オブジェクト関数 (メソッドと呼ばれることもあります) を装飾するときに便利です。

于 2012-05-03T15:58:00.443 に答える
3

引数と apply を使用してより一般的に:

function myfunction(foobar) { 
    alert(foobar); 
}

function decorate(callback) { 
    return function() { 
        callback.apply(null, arguments); 
        console.log(arguments); 
    }; 
}

var result = decorate(myfunction);

result("Hi there");
于 2012-05-03T16:10:57.577 に答える