質問: AAA; ```
回答: 私自身は基本的にCoffeeScriptしか書かないので、悩んだことはありません。CoffeeScriptでは関数宣言にあたる記法はありませんが、問題になったことはありません。そもそも、基本的にクラスを書くことになるため、クラスとは関係ない関数を単独で書くことはラムダ式扱いの無名関数を除くとほとんどありません。 私自身のことは置いておいて、2016年で最も良い方法は?と言われた場合、お勧めするのは、 **TypeScriptを用いてクラスベースで書く** です。 複雑かつ大規模化する昨今のJavaScriptにおいて、TypeScriptの静的型付けはかなり大きなアドバンテージを得られます。また、基本的にクラスのメソッド(メンバー関数)として書くようにすることで、関数を単独で書くこと自体をなくします。ですので、**関数宣言と関数式のどちらでもなく**、クラスでのメソッドの書き方とラムダ式としての無名関数以外で関数を書くことがなくなります。 プロトタイプベースオブジェクト指向はとても柔軟で強力ですが、いかんせん使いこなすにはテクニカルな部分が多く、かなりの知識と慣れが必要になります。反面、クラスベースオブジェクト指向はデザインパターンなどの研究も進んでおり、他言語での採用が多いことから、扱いやすさと言う面では圧倒的と言っても良いでしょう。クラスベースオブジェクト指向を前面に出し、クラスを基本として記述することが最良と考えています。 JavaScriptを関数型言語として扱い、関数を主体としたいと考える人もいるでしょう。しかし、JavaScriptは関数型言語としては不十分な点が多く、扱いにくいと私は思っています。TypeScriptも関数型言語としての側面は重要視しておらず、JavaScriptに準じています。より関数型言語のように扱いたければ、PureScriptやLiveScriptの採用を検討すべきです。これらには、関数のカリー化や部分適用、関数合成、パイピング、リスト内包表記、モナド(PureScriptのみ)、そして強力なPreludeが用意されており、関数型プログラミングがとても書きやすくなっています。 ECMAScript2015でも良いのではと思うかも知れませんが、TypeScriptの静的型付けが強力なため、ECMAScript2015を使うメリットがあまりありません。Reactを使う場合はBabelを使ってJSX変換で優位というのもありましたが、TypeScriptがJSX表記に対応したため、TypeScriptを使わない理由が無くなりました。node.jsやElectronであれば、ネイティブである程度対応しているというのは確かにありますが、V8エンジンも全てに対応しているわけで無いこと、他ブラウザ向けにするときはES5に変換が必須なことを考えると、結局、TypeScriptと同じように変換は必要になったりします。そもそもその変換も多くのタスクツールが用意されているため、それほど問題になりません。また、規模が小さく、静的型付けを使うほどでも無いというのであれば、CoffeeScriptを使った方がはるかに楽です。 以上、かなり偏った意見ですが、参考になれば幸いです。なお、私自身はOpalを検討中ですが、色々とうまくいかないところがあるのでちょっと悩み中です。