🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

JavaScript

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

React.js

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

Q&A

解決済

3回答

928閲覧

(JavaScript) アロー関数について

gano

総合スコア39

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

JavaScript

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

React.js

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

1グッド

2クリップ

投稿2019/11/23 12:54

JavaScriptのアロー関数について、わからない表現がでてきたので、質問させてください。

Reactのコードを読んでいたら以下のような表現がでてきました。

const navigateOnce = getStateForAction => (action, state) => { const { type, routeName } = action; if (state && type === NavigationActions.NAVIGATE) { //直前のrouteNameと遷移先のrouteNameが同じであれば遷移無効化 if(routeName === state.routes[state.routes.length - 1].routeName) return null; } return getStateForAction(action, state); };

アロー関数は A = (args...) => {} という表現かと思っていたのですが、
今回は A = B => (args ... ) => {} となっており、AとBの関係をどう解釈すれば良いかわからない状態で困っています。Aの後にBを実行するのか? A=Bとして同じ関数とみなすのか? ... 混乱しております。どなたかアドバイスいただけますでしょうか。。よろしくお願いいたします。

mogura_koko👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

数値nに1足してから2を掛ける関数で説明しようと思います。

アロー関数は A = (args...) => {} という表現かと思っていたのですが、

ということですので、以下は分かりますよね?

JavaScript

1const addOneThenDouble = (n) => { return (n + 1) * 2; }; 2addOneThenDouble(5); 3//=> 12

アロー関数は() => {return 式;}の時は() => 式と書くことが出来ます。

JavaScript

1const addOneThenDouble = (n) => (n + 1) * 2; 2addOneThenDouble(5); 3//=> 12

また、(n) => n + 42のように、引数が唯一つのとき、n => n + 42のように引数部まわりのカッコを省略できます。

JavaScript

1const addOneThenDouble = n => (n + 1) * 2; 2addOneThenDouble(5); 3//=> 12

ここで、数値nに1足してから2を掛ける関数を、数値nにX足してからYを掛ける関数に拡張してみようと思います。

JavaScript

1const addXMulY = (x, y, n) => (n + x) * y; 2addXMulY(1, 2, 5); 3//=> 12

足す数、掛ける数が固定でnが様々に変わる場合、いちいち引数に1,2を与えなければならないのが面倒ですね。
そこで以下のように「XとYを引数に取り、「nにX足してからYを掛ける関数」を返す関数」を作ることができます。(念のため、「アロー関数だから」できるわけではありません。functionでもできます。アロー関数で書くとこうなります、ということです)

JavaScript

1const addXMulY = (x, y) => n => (n + x) * y; 2const add1Mul2 = addXMulY(1, 2); 3add1Mul2(5); 4//=> 12 5// 途中関数を変数に保存せず以下のようにも書けます 6addXMulY(1, 2)(5); 7//=> 12

さらに進めて「Xを引数に取り、「Yを引数に取り、「nにX足してからYを掛ける関数」を返す関数」を返す関数」を作ることもできます。

JavaScript

1const addXMulY = x => y => n => (n + x) * y; 2const add1MulY = addXMulY(1); 3const add1Mul2 = add1MulY(2); 4add1Mul2(5); 5//=> 12 6// 途中関数を変数に保存せず以下のようにも書けます 7addXMulY(1)(2)(5); 8//=> 12

一番最後のものをfunctionで書き換えると以下になります。他のも書き換えてみてください。理解が進むと思います。

JavaScript

1const addXMulY = function(x) { 2 return function(y) { 3 return function(n) { 4 return (n + x) * y; 5 }; 6 }; 7}; 8const add1MulY = addXMulY(1); 9const add1Mul2 = add1MulY(2); 10add1Mul2(5); 11//=> 12 12addXMulY(1)(2)(5); 13//=> 12

投稿2019/11/23 15:47

shinji709

総合スコア805

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

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

gano

2019/11/26 02:22

非常に分かりやすい説明ありがとうございます。 関数を引数にとったり、関数をreturnする関数は散々やっているのに、アロー関数で⇒ が2つでてきて頭混乱してしまいました。 よく頭整理できました。
guest

0

古典となりつつある無名関数の書式に展開すると理解できるはずです。

javascript

1const navigateOnce = function(getStateForAction) { 2 return function(action, state) { 3 const { type, routeName } = action; 4 if (state && type === NavigationActions.NAVIGATE) { 5 //直前のrouteNameと遷移先のrouteNameが同じであれば遷移無効化 6 if(routeName === state.routes[state.routes.length - 1].routeName) { 7 return null; 8 } 9 } 10 return getStateForAction(action, state); 11 } 12};

無名関数から置き換わる中で覚えた特徴はこんな感じでした

関数の処理(=> の右辺):
return が明確なとき、ブロック構文や return を省略できる

  1. () => { ステートメント } ステートメントを処理するが、返値は void 0
  2. () => { return ステートメント } ステートメントの結果を返す。
  3. () => ステートメント 2. と同じ。省略できるので短く書ける

関数の引数:(=>の左辺):
functionを省略でき、引数の個数が1だと括弧も省略できる。

  1. () => {}; 引数なし
  2. (引数) => {}; 引数が1つのとき。
  3. 引数 => {}; 引数が1つのときは括弧を省略できる
  4. (...args) => {} スプレッド演算子で引数を与える場合は複数扱い。

noop を書いてみる

  • () => {} // 引数=1. 実装=1. の形式で
  • () => void 0 // 引数=1. 実装=3. の形式で

投稿2019/11/23 22:00

AkitoshiManabe

総合スコア5434

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

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

gano

2019/11/26 02:23

分かりやすい回答ありがとうございます。 => を2つ使うという観点で アロー関数の文法規則を探していたのですがうまく検索できずでした。頂いたコメントで非常に頭が整理できました。ありがとうございます。
guest

0

たぶんこうなのでは。

js

1const A = ( B ) => { // B は引数として渡す関数 2 return ( action, state ) => { // 最初のアロー関数に、アロー関数を返している 3 return B( action, state ); // 最初の引数に入れた関数の結果を返す 4 } 5}

投稿2019/11/23 13:01

kei344

総合スコア69596

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問