今までコードを書くとき下記のような形で無名関数を利用することが多かったのですが、
改めて調べてみると複数回実行する必要がない関数を定義するときに有用、という記事が複数でてきました。
var test = function(){ console.log('hoge') } $(window).on('resize', function () { test(); }); $(window).on('load', function () { test(); });
なんとなくの手癖でずっと無名関数を書いてそれを通常の関数のごとく利用してきたのですが、
無名関数を複数回利用することは基本的によくないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答7件
0
ベストアンサー
プロジェクト内で統一されていれば
変数宣言に無名関数作って代入する事は問題ありません。
ただし巻き上げがあるので、プロダクト内での混在は絶対にしないように注意しましょう。
これだけが鉄の掟です。
さて、それを踏まえてどちらが良いのか?
あくまで私個人の意見としては
巻き上げはバグの温床でこそあれ、有用なシーンがありません。
もし私がプロジェクトリーダーであれば巻き上げが含まれるコードは全て破棄!
これからは無名関数を代入しましょう!
私個人の好き嫌いを語っても仕方ないので、
一般的な流れとして巻き上げを排除していく流れを2つ紹介します。
- CoffeeScriptの実装
- ES2015の実装
CoffeeScriptの実装
CoffeeScriptと呼ばれるAltJSの一つがあります。
これはRubyやPythonのようなイケてる構文を使ってJavaScriptを表現し、
最後のWebサーバからブラウザに読み込ませるタイミングでコンパイルすると、
素のJavaScriptのコードに生まれ変わるというものです。
このCoffeeScriptで作られたコードは
JavaScriptに置き換えた時に一貫性のある非常に美しいコードになる事が特徴で、
それをもってお行儀の良いコードと評価されていました。
ES2015以降の新JavaScriptで次々と導入されたモダンな構文でCoffeeScript別に要らんよなとなり、
TypeScriptに完全に負けてしまいましたが……
そのCoffeeScriptが採用している唯一の関数宣言がこちら!
CoffeeScript
1square = (x) -> x * x
js
1var square = function(x) { 2 return x * x; 3};
普通の関数宣言が出来ないんですね。
この辺の実装から巻き上げによる処理順の変更を嫌った事がわかります。
別にこれでも困った試し等一度もありません。
CoffeeScriptをベースに更に拡張したAltJSは色々とあり、
私はその派生の一つを愛用していますが、それも関数宣言はこれ一択です。
ES2015の実装
ES2015により従来のvar
宣言の他に、2つの宣言が追加されました。
新しい宣言は巻き上げを行いません。
これはもう巻き上げに依存した設計にするなと言っているようなものでしょう。
他にもアロー関数の実装が目玉ですよね。
もうfunction
なんて予約語は不要です。
大手のコーディングスタイルガイドなんかで明確に関数宣言やめろと言ってる記事みたいなものは見つかりませんでしたが、
PySpaという団体が下記の記事で関数宣言はconst
にアロー関数を代入しようよと説いています。
イマドキのJavaScriptの書き方2018 - Qiita
アロー関数のみにしていく
functionキーワードはもう捨てましょう!functionキーワードのthisの取り扱いはトラブルの元です。もう存在しなかったものとして歴史の闇に葬ります。次の書き方は古いfunctionキーワードを使っています。こういう説明を見かけたらゴミ箱にダンクシュートします。
js
1// 古い関数定義 2function name(引数) { 3 本体 4}
今時はアロー関数を使って書いていきます。特に、今時の書き方は、JavaScriptでよく扱う、無名関数との相性が非常に高くなっています。
js
1// 今時の関数定義 2const name = (引数) => { 3 本体 4};
言いたいことが全部書いてありました。
JSのthisの扱いも非常に面倒で巻き上げと共に忌み嫌われる機能TOP2です。
ES2015で追加されたクラス構文以外、一切のthisは不要となりました。
投稿2020/02/21 02:57
総合スコア21400
0
yambejpさんの回答が正答かと思いますが、
定義の仕方によって、性質がいくつか異なるため、その部分の回答をさせていただきます。
宣言の順番が関係あるかないか
これが一番の違いになります。
例えば、下記のような場合、宣言がないというエラーが起きます。
javascript
1hoge(); // Uncaught ReferenceError: Cannot access 'hoge' before initialization 2 3const hoge = function(){ 4 console.log('hoge'); 5};
これは、宣言子でhoge
を宣言しているため、行の上から処理となるので、
hoge
なんてないよ、とエラーが起きています。
しかし、下記では宣言の順番は関係なく、エラーは起きません。
javascript
1hoge(); // hoge 2 3function hoge(){ 4 console.log('hoge'); 5}
これは、JavaScriptのこの定義の仕方の最大の特徴と言えるでしょう。
再代入を不可にできるか否か
あまり意識しないことですが、下記の場合、再代入となるので、中身が変わってしまいます。
javascript
1function hoge(v){ 2 this.value = v; 3 console.log('hoge'); 4} 5hoge.prototype.echo = function(){ 6 console.log(this.value); 7} 8 9hoge = 25; 10 11const hogeInstanse = new hoge('hoge'); // Uncaught TypeError: hoge is not a constructor
対して、宣言子を使った場合、
const
を使うことができるため、再代入不可にすることも可能です。
javascript
1const hoge = function(v){ 2 this.value = v; 3 console.log('hoge'); 4} 5hoge.prototype.echo = function(){ 6 console.log(this.value); 7} 8 9hoge = 25; // 再代入不可なので、ここでエラーが起きてくれる Uncaught TypeError: Assignment to constant variable. 10 11const hogeInstanse = new hoge('hoge');
何がいいかというと、こうしておけば、同じ変数名使わないで済んで未然にエラーを回避できるってわけですね。
他にも様々違いはあるかと思いますが、
ようは特徴を認識し、使い分けをするといいのではないかと思います。
今回の質問の場合は、他の回答者さんのおっしゃる通り、無名関数にする必要はないかと思います。
ですが、もしかしたら、無名関数として定義する必要がある場面もあるかもしれません。
投稿2020/02/21 02:10
総合スコア9555
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ES2015+で書くのであれば、その結論に至るまでの考察は長くなるのでここでは省かせていただきますが、私はconst宣言初期化子アロー関数const f = () => {};
を推奨します。
なお、ES5の場合は、**代入によって関数に名前が設定されないため、**質問にあるような書き方は推奨しません。(そもそも、ES5を使い続けることを推奨しません。)
投稿2020/02/21 13:54
総合スコア21749
0
別に大した違いがないので、問題ないと思います。
js
1 var test = function(){}; 2 test.name; // "test"
js
1 function test(){}; 2 test.name; // "test"
投稿2020/02/21 04:33
編集2020/02/21 05:17総合スコア37413
0
このサンプルの通りであれば次のように書けば良いのでは?
JavaScript
1var test = function() { 2 console.log('hoge') 3} 4$(window).on('resize', test); 5$(window).on('load', test);
投稿2020/02/21 00:14
総合スコア7903
0
良くないとは言わないですが、「無名」である意味があまりないですよね
function test(){
console.log('hoge')
}
と、普通に関数をつくればいいので。
投稿2020/02/21 00:11
総合スコア117667
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/21 04:42

0
共通の処理を関数化する理由がほぼメンテナンス的な理由なので。
同じ無名関数を書いてある部分が明らかに同じ処理を行うことがわかっているなら
関数定義化しておいた方が後々修正が必要になった時に楽だし、
修正忘れが発生することでバグの温床になることを防ぐことができます。
投稿2020/02/21 00:19
編集2020/02/21 00:20総合スコア2183
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/24 23:35