Decorators on functions

纵饮孤独 提交于 2019-12-20 09:46:23

问题


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.


回答1:


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




回答2:


You certainly have a point here.

But as neo_blackcap pointed out, function decorator are not part of the ES7 decorators draft.

So, the best thing you can do is to start discussion on the corresponding tracker to attract community attention to your proposal.

ES7 decorators are on their first stage of development second stage of development, meaning that their API is still under development and could undergo any change.




回答3:


I think the problem is function decorator has not been ES7 draft.

Of course, you still can implement your function decorator by yourself



来源:https://stackoverflow.com/questions/31771856/decorators-on-functions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!