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

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

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

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

Q&A

解決済

1回答

3283閲覧

Javascript で 括弧 が二重になっている構文

KazuyaKurihara

総合スコア4

JavaScript

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

0グッド

0クリップ

投稿2022/01/15 13:55

わからないこと

下のような構文を見つけたんですが、("hoge")(some_func) 部分で動くのは分かるんですが、意味が分かりません。
なんとなく、「args =>」部分の args に 2つ目の関数が代入されているのは分かるんですが、その根拠が分かりません。

javascript

1function hoge(str) { 2 return args => args(str) 3} 4 5function some_func(str){ 6 console.log(str) 7} 8 9hoge("hoge")(some_func)

関連するドキュメントはどこにあるんでしょうか?
また、どのような時にこのような書き方をするんでしょうか?

ご教授お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascriptは関数もオブジェクトなので、関数が関数を返すことができます。
つないで書いてるところを分割すると

javascript

1var fun = hoge("hoge") // fun = arg => arg(str) 2 3fun(some_func) // arg = sum_func

となりますが、この時「hoge関数」に渡した引数str(つまり"hoge")は、hoge関数が終了しているにもかかわらず、funの実行時にも読みだすことができていますよね。通常、関数内のローカル変数(ここではstr)は、関数が終了した時点で開放されるので、読みだせなくなるはず、のところが読めてしまっている、という事はわかりますか?

これはクロージャという機能で、関数内で関数を定義(高階関数と言います)して、子が親のローカル変数を参照していて、さらに親関数から子関数をreturnして外に出した場合、親が終了した後も子が親のローカル変数を使うので、子関数のクロージャという領域に変数をコピーするという動きが、内部で行われます(レキシカルスコープとも言います)。

ここではstrが、arg => args(str)関数のクロージャ領域にコピーされ、returnされます。これにより、hoge関数に渡した文字列を保持した関数を作る関数が作れます。

javascript

1var hogeWriter = hoge("hoge") // "hoge"を出力するWriter関数を作る 2 3var fugaWriter = hoge("fuga") // "fuga"を出力するWriter関数を作る 4 5hogeWriter(some_func) 6fugaWriter(some_func)

クロージャ、というキーワードで調べてみると良いと思います。

(追記)
※分割せずに連続で書くとhoge("hoge")(sum_func)ですが、これが何故かは処理の内容次第ですが、
単にクロージャ関数を連続で呼び出して短く書いただけ、で良いと思います。

投稿2022/01/15 14:26

編集2022/01/15 14:47
umau

総合スコア805

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

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

KazuyaKurihara

2022/01/16 08:57

すぐには分からなかったんですが、考えたら分かりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問