Decorators on functions

user663031 picture user663031 · Aug 2, 2015 · Viewed 11k times · Source

I see that babel.js decorators (available in "stage 1") implement the spec at https://github.com/wycats/javascript-decorators. It appears that decorators are limited to (1) classes, (2) accessors, and (3) methods. In my case, I want to use decorators on plain old functions, as in

@chainable
function foo() { }

where (just an example)

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

I don't see any logical reason why decorators should not be able to apply to functions. My question is, is there some way to accomplish this? Or is there some good reason why functions cannot be decorated?

It turns out there is an issue raised for this at https://github.com/wycats/javascript-decorators/issues/4.

Answer

Axel Rauschmayer picture Axel Rauschmayer · Nov 25, 2015

To execute a decorator, you evaluate an expression and doing that prevents hoisting (even for a variable declaration, the right-hand side of an assignment stays put). Therefore, it is not compatible with function declarations being hoisted.

As a work-around, I suggested that function expressions, generator function expressions and arrow functions could be enabled to be decorated:

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

Alas, that wasn’t met with much enthusiasm: Decorators for functions