それは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:29