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/16 08:57