56

babel.js デコレータ (「ステージ 1」で利用可能) がhttps://github.com/wycats/javascript-decoratorsで仕様を実装していることがわかります。デコレーターは、(1) クラス、(2) アクセサー、および (3) メソッドに限定されているようです。私の場合、次のように、単純な古い関数でデコレータを使用したい

@chainable
function foo() { }

どこで(ほんの一例)

function chainable(fn) {
  return function() {
    fn.apply(this, arguments);
    return this;
  };
}

デコレータを関数に適用できない論理的な理由がわかりません。私の質問は、これを達成する方法はありますか? または、関数を装飾できない正当な理由がありますか?

https://github.com/wycats/javascript-decorators/issues/4でこれに対して提起された問題があることが判明しました。

4

3 に答える 3

30

デコレーターを実行するには、式を評価し、ホイストを防止することを行います (変数宣言の場合でも、代入の右側は置かれたままです)。そのため、関数宣言の巻き上げには対応していません。

回避策として、関数式、ジェネレーター関数式、およびアロー関数を装飾できるようにすることを提案しました。

const func = @someDecorator('abc') (x, y) => { return x + y };

残念ながら、それはあまり熱狂的ではありませんでした:関数のデコレータ

于 2015-11-25T12:02:11.383 に答える