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

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

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

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

3回答

9373閲覧

ES6の文法でわからないところが

mattun

総合スコア28

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

2クリップ

投稿2017/04/01 09:50

編集2017/04/01 10:13

コードがわからなくて困っております。

ちなみにこれはreact-reduxのコードを見ております。

arrow関数が連続で使用されている場合どの順番で評価されて行くのか理解できないです。

function createThunkMiddleware(extraArgument) { //このreturnでarrow関数を呼び出してnextもactionも多分関数なのでしょうか?どのようにかんがえたらよいのか。。。 return ({ dispatch, getState }) => next => action => { if (typeof action === 'function') { return action(dispatch, getState, extraArgument); } return next(action); }; } const thunk = createThunkMiddleware(); thunk.withExtraArgument = createThunkMiddleware; export default thunk;

上のコードの2行目のところが何をやっているのかわからなくて困ってます。

ES5風に書くと

javascript

1return function({dispatch, getState}){ 2 next({dispatch, getState}){ 3 action({dispatch, getState}) 4 } 5}

のような処理が実行されているということでしょうか?

ちなみにこれはreact-reduxのコードを見ております。
宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

この書き方は関数型プログラミングでよく使われるカリー化された関数の作り方です。

例えば、

JavaScript

1const f = x => y => z => x + y + z; 2console.log(f(1)(2)(3));

これは右から左に結合されて、

JavaScript

1const f = (x) => { 2 return (y) => { 3 return (z) => { 4 return x + y + z; 5 }; 6 }; 7}; 8console.log(f(1)(2)(3)); // => 6

と解釈され、ES5に変換すると

JavaScript

1var f = function f(x) { 2 return function (y) { 3 return function (z) { 4 return x + y + z; 5 }; 6 }; 7}; 8console.log(f(1)(2)(3));

となります。実際にBabelで変換してみて、どうなるかを見てください。

カリー化された関数というのは関数を返す関数、いわゆる高階関数の一種です。この関数は、引数を一つ取り、引数を一つ取る関数を返します。無限にネストすることができますので、どんどん深めることができます。複数の引数を取る関数との違いは、簡単に部分適用することができると言うことです。上の例ですが、

JavaScript

1const f = x => y => z => x + y + z; 2const g = f(1); 3console.log(g(2)(3)); // => 6 4console.log(g(4)(5)); // => 10

というような書き方ができます。

その他、これがどのように役に立ち、どのように振る舞うかというのはちょっと言葉では言い表せないです。たぶん、Haskell等の本物の関数型言語で関数型プログラミングを学ばないと感覚的な物はつかめないと思います。JavaScriptは関数型言語としての最低条件のもの(関数が第一級オブジェクトであると言うもの)はありましたが、言語としては決して関数型プログラミングしやすい物ではありませんでした。ES6以降に追加されたアロー関数やRamda等便利なライブラリを使うことで、なんとか関数型プログラミングが可能な物になってきています。そのため、Redux等の最近のライブラリは関数型プログラミングの考えを取り入れた物が多くなっているようです。

投稿2017/04/01 10:39

raccy

総合スコア21735

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

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

0

とりあえず使ってみました。

javascript

1 2var _お寿司屋さん = createThunkMiddleware('さび抜き') 3({dispatch:'まぐろ', getState:2}) 4( 5 () => alert('売り切れだよ!') 6); 7 8_お寿司屋さん( 9 (x,y,z) => alert(`${x}${y}貫おまち!${z}ね!`) 10); 11//まぐろ2貫おまち!さび抜きね! 12 13_お寿司屋さん('品切れ'); 14//売り切れだよ!

投稿2017/04/01 10:46

Lhankor_Mhy

総合スコア36115

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

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

0

実行結果としては関数が返る形です。
なので、thunkの中には関数が入っています。

javascript

1function createThunkMiddleware(extraArgument) { 2 return function({dispatch, getState}) { 3 return function(next) { 4 return function(action) { 5 if (typeof action === 'function') { 6 return action(dispatch, getState, extraArgument); 7 } 8 return next(action); 9 }; 10 } 11 } 12}; 13 14const thunk = createThunkMiddleware(); 15 16/* 17function({dispatch, getState}) { 18 return function(next) { (略) } 19} 20*/

さらにthunkを実行すると、1つ内側の関数が返されます。
基本はそれだけです。

javascript

1thunk(); 2 3/* 4function(next) { 5 return function(action) {(略)}; 6} 7*/ 8

投稿2017/04/01 11:04

yamato_hikawa

総合スコア2092

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問