質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

5回答

29589閲覧

js 関数の中に関数の使い方

L85A2

総合スコア60

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

4クリップ

投稿2018/11/15 09:49

js

1 function hoge(){ 2 console.dir("hoge"); 3 hogege(); 4 function hogege(){ 5 console.dir("hogege"); 6 } 7 } 8

このような関数の中に関数を書くことは先輩からよくないといわれましたが理由がわかりませんでした。
hogegeメソッドはhoge以外では使わない想定なので、hogegeがhogeの外から直接呼ばれなければよいと思っているのですが直接呼ぶ方法でもあるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/15 10:04

理由を聞けば良いのでは。見ている方としてはその先輩の考え方の方が気になります。
guest

回答5

0

理由は先輩に聞いてください。

関数は実行した瞬間に全て実行されます。
その場合、質問文に登場したhogege関数は実行される度に生成されます。
もし2回実行された場合はhogege関数は2回生成され、削除されるので実行速度に多少ダメージになるでしょう。

後はどのレベルで使わないと想定しているかにもよります。
基本的にプログラミングでコピペは常に悪手です。
他で使いたくなった場合、コピペで同じ関数を生成することになるような事は出来るだけ避けてください。

質問文のコードでは判断出来ませんが、
誰がどう見てもその中で完結する関数ならばそういう書き方でも良いと思います。
とはいえ、関数化する意味あるのか?とか、無名関数の即時実行関数でよくね???問題がつきまとうでしょうけど。

最後に、関数宣言は巻き上げのルールが結構複雑なので、
もし私が先輩ならばfunction hoge () {という宣言をやめさせて、
var hoge = function () {の書き方で統一させます。
これはCoffeeScriptが採用しているルールでもあり、関数宣言は一切使う場面が無い事を示しています。

投稿2018/11/15 10:33

編集2018/11/15 10:35
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

L85A2

2018/11/16 02:17

回答ありがとうございます。 jsは触って間もないので関数宣言の巻き上げのルールが複雑だということを知らないで使っていました。 関数の巻き上げ問題は以下の記事でなんとなくわかったような気がします。 https://qiita.com/cocottejs/items/143f70e806c61ffafe28 >function hoge () {という宣言をやめさせて、 >var hoge = function () {の書き方で統一させます。 の意図がいまいち理解できていないのですが、変数に無名関数を格納することで 必ず関数の宣言後にしか関数を呼べないようにすることにより可読性を上げているという意味合いで いいのでしょうか?
miyabi-sun

2018/11/16 03:05

そうですね、JavaScriptはブラウザ上で動作するので、 今まで使えてた書き方が明日からブラウザがバージョンアップするのでエラーが出るようになりました! …という事になるので下位互換性は確保しなければなりません。 PHPもバージョン4からの名残の「この設計でいこうと決めた奴絶対頭おかしいだろ」みたいな仕様や関数名がちらほら残っており、バージョン7になった今もやきもきさせられる箇所があります。 PHPは致命的なものは数段階のバージョンアップで推奨されない機能→エラーが出るよう修正→削除という風に緩やかな移行を促す運用で緩やかにメンテナンスしています。 JSも1990年代の致命的な設計の殆どは取り除けておらず、運用ルールでカバーしてね☆彡みたいな暗黙の了解に頼る箇所が多くあります。 この辺はLinter使っても良いですが、現場現場で違う事もあるので、 先輩にレビューしてもらうと良いでしょう。
Meganezaru

2018/11/16 07:06

横からすいません・・・ 巻き上げという言葉を、初めて知りました・・・知識不足を痛感です(^_^;) なんとなく、巻き上げの意図はわからなくもないような・・・ varとfunctionに巻き上げの差があるのは、 変数は代入のタイミングがロジック上重要だけど(変数確保はするけど、中身はその時にね)、 関数は、処理の塊としての静的な定義タイミングに意味がない(変数確保と中身代入をしてしまえ)、 から、とかではないですかね? 調べてはいないですが・・・ constなんかも、functionと同じ扱いになる気がします。 浅はかな考えな気もしますが(^_^;) ただ、その仕様をあえて期待して書くメリットのあるロジックは、 特にない気がするのですが・・・ それでも、何か不都合が出てしまうんですかね? 気が向けば、後学のために、お話聞かせていただければ・・・
guest

0

よくないことはないと思います。

hogegeメソッドはhoge以外では使わない想定

このことを意識してコードが書けているのはむしろ良いことだと思います。これを否定する理由がないです。独立性の低いものはhogeの外に定義しないほうが良いですし、独立性が低い中でもまとまった処理は関数化して括りだすのは良い設計だと思います。また、関数内関数を外から呼び出すことはできないと思います。

アロー関数で書いたほうがいいとか、単にブロックスコープがほしいならletでいいとか、コールバックなら無名関数で書けとかいうことなら少し検討してもいいかもしれません。

あとjsに限らず関数(処理)を切り出せる人は、関数を使わずに書くことが容易にできますが、逆は難しいので特に気にするような指摘ではないと思いました。
また、仮にここでだめな理由があがっても、理由を説明できない程度の指摘だと思ったほうが良いと思います。

投稿2018/11/15 10:42

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なんとも言えませんが、そのスコープでしか有効ではないものをわざわざ関数化する必要があるのか?
ってことじゃないですか?
逆に同じスコープ内で何度も再利用するなら、プログラム全体でも再利用する可能性があるので
いずれにしても関数内関数をわざわざ設定する必要性が感じられませんが・・・

投稿2018/11/15 10:25

yambejp

総合スコア114777

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

正確なところは聞いてもらうとして…

ありがちなところでは、過去にそういうコーディングをしていた部分で
発見しづらいバグがあって大変な目にあってしまった、とか?
社内のコーディング規約もしくはそれに準ずるものに
そういう記述があったり?
ひょっとしたら、単にその方が「きもちわるい」と感じる
コーディングだったのかも?

投稿2018/11/15 10:40

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

hoge()を実行するたびに、hogege()が定義されるのは無駄じゃないか!
とか、な話だったりするんですかね・・・(笑)

実行効率とかメモリ効率とかが、要件としてある場合は、
大事なことなのかもしれないですね。
自分の実務上ではあまりないので、
詳しくは理解していないですが・・・

そういうものを求めないのであれば、
コードの意図が、他人(未来の自分も含め)読みやすいコードのほうが、
有用なことが多いように思います。

メンテナンスする機会は多いですしね(^^)

あくまで、個人的な意見ですが。

投稿2018/11/15 10:38

Meganezaru

総合スコア715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問