JSのforEach文の使い方とコールバック関数

JSのforEach文の使い方とコールバック関数

JSの配列にはforEach文が存在します。

let arr = [1,2,3,4,5];
arr.forEach((data,i,arr) => {
console.log(i);
});

view raw
gistfile1.txt
hosted with ❤ by GitHub

forEachの引数はコールバック関数、もしくは上記のようにアロー関数です。

forEach文のコールバック関数は引数が3つありまして、1つ目は配列のデータ、2つ目はインクリメント(0が基底)、3つ目はforEachしている配列です。

なので、上記の結果は以下になります。

0
1
2
3
4

view raw
gistfile1.txt
hosted with ❤ by GitHub

ちなみに、forEachを使う際は以下のようにnull,undefinedチェックしてから書いてほしいです。

let arr = [1,2,3,4,5];
if (arr) { // 配列がforEach出来るかチェックしておく
arr.forEach((data,i,arr) => {
console.log(i);
});
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

でも本当はforEach文は使いたくない派です。

コールバック関数

コールバック関数とはそもそもなんなんでしょうか。

function minus(a, b) {
return a-b;
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

minus関数の宣言ではコールバック関数を使わずにreturnしています。

使い方は

minus(5, 3);

view raw
gistfile1.txt
hosted with ❤ by GitHub

のように使います。

このminus関数をコールバック関数を使って宣言してみます。

function minus(a, b, callback) {
callback(a – b);
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

callbackを最後の引数で指定して、return文を使っていません。

コールバック関数を使用したminus関数の使い方は

minus(4, 2, function(ret) {
return ret; // 2が返る
});

view raw
gistfile1.txt
hosted with ❤ by GitHub

のように使います。第三引数のコールバック関数を実装している点が違うだけで、minus関数自体は同じ振る舞いをする関数となります。

forEachよりasyncモジュールを使う

node.jsではforEachを使うことはほぼないです。

for-of文を使うなど代替案を考えた方が良いです。forEach内でsetTimeoutを使うと意図した通りに動作せずにさきにhello.txtが作成され、中身は空となります。

const fs = require('fs')
var arr = [1,2,3,4,5,6,7,8,9,10];
var sent = "";
arr.forEach(function(i) {
setTimeout(function() {
sent += 'hello world: ' + i + '¥n';
}, 5000);
});
fs.writeFile('hello.txt', sent, function(err) {
if(err) throw err;
});// hello.txtは空ファイルになってしまう

view raw
gistfile1.txt
hosted with ❤ by GitHub

このような場合はasyncモジュールを使用します。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA