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

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

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

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

Q&A

解決済

2回答

1531閲覧

forEachの関数の呼び出しについて

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2019/02/06 17:14

関数を呼び出すときは 関数名()のように呼び出すと思うのですが、
どうして以下の一つ目コードのように ()を使わないで呼び出さないといけないんですか?

2つ目のコードだとエラーが出ます。
それぞれのコードでの処理を違いを教えていただきたいです。

js

1var numbers = [1,2,3,4,5]; 2 3var sum = 0; 4 5function adder(number) { 6 sum += number; 7} 8 9numbers.forEach(adder); 10

js

1var numbers = [1,2,3,4,5]; 2 3var sum = 0; 4 5function adder(number) { 6 sum += number; 7} 8 9numbers.forEach(adder()); 10

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

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

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

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

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

guest

回答2

0

ベストアンサー

2つ目のコードだとエラーが出ます。

forEachの引数には関数自体を渡す必要があるからです。
adder()と渡してしまうと、その場で実行した返り値をforEachに渡すことになります。

js

1var numbers = [1,2,3,4,5]; 2var sum = 0; 3 4function adder() { 5 return function (number) { // 返り値に関数を返せば動く。 6 sum += number; 7 console.log(sum); 8 }; 9} 10numbers.forEach(adder()); 11```**動くサンプル:**[https://jsfiddle.net/drznq3jo/](https://jsfiddle.net/drznq3jo/) 12 13--- 14 15【Array.prototype.forEach() - JavaScript | MDN16[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)

投稿2019/02/06 17:47

kei344

総合スコア69407

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

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

退会済みユーザー

退会済みユーザー

2019/02/07 04:29

forEachは関数自体を渡す必要があるのですね。 動くサンプルなども用意していただきありがとうございました。
guest

0

それはJavaScriptが関数を引数に渡して実行してもらう特殊な言語だからです。

まずはやることを関数として作ってしまいます。
この時、adder関数はTODOリストであり、数値を入れて実行すればsumの数値が増える仕組みになっています。

JavaScript

1var sum = 0; 2function adder(number) { 3 sum += number; 4}

Array.prototype.forEachは関数を引数としてくださいと言っています。

JavaScript

1// こういう風に実行すると 2var numbers = [1,2,3,4,5]; 3numbers.forEach(adder); 4 5// =====forEachの実行をエミュレート===== 6for (var i = 0; i < numbers.length; i++) { 7 var num = numbers[i]; 8 adder(num, i, numbers); 9}

2つ目のコードだとエラーが出ます。

それぞれのコードでの処理を違いを教えていただきたいです。

当然の話をしますが、関数はお尻に()を付ければ実行として扱います。
adderは引数を1個取りますが、returnを書いていないのでundefinedが帰ってきます。

JavaScript

1// undefinedを実行してみよう! 2var fn = undefined; 3fn(1); // VM102:2 Uncaught TypeError: fn is not a function

エラーが出て起こられました。
関数実行が出来るのは当然ながら関数だけです。

つまり、どういうことだってばよ?

JavaScript

1var numbers = [1,2,3,4,5]; 2numbers.forEach(adder()); 3 4// =====forEachの実行をエミュレート===== 5var fn = adder(); // この時点でfnにはundefinedが格納される 6for (var i = 0; i < numbers.length; i++) { 7 var num = numbers[i]; 8 fn(num, i, numbers); // fnは関数じゃないのでエラーになって死ぬ 9}

知ってれば当然の話ですね。
なのでforEachには関数を渡してあげましょう。

他のコールバック関数も同様で、関数を実行してしまうと値に変化してしまうので、
実行せずに渡してあげてください。

投稿2019/02/07 04:44

miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2019/02/07 04:51

詳しく回答して頂きありがどうございます。勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問