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

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

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

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

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

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

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

0
1
2
3
4

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

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

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

コールバック関数

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

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

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

使い方は

minus(5, 3);

のように使います。

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

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

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

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

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

のように使います。第三引数のコールバック関数を実装している点が違うだけで、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は空ファイルになってしまう

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

コメント

タイトルとURLをコピーしました