JavaScript | 関数リテラル(無名関数)とアロー関数を初心者向けに比較

JavaScript JavaScript
スポンサーリンク

では、ブラウザ上で ボタン押下やイベント処理を使って無名関数とアロー関数を体感できる演習サンプル を作ります。
下のコードを HTML ファイルとして保存してブラウザで開くと、ボタンを押すとそれぞれの挙動が確認できます。


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>無名関数とアロー関数の比較演習</title>
</head>
<body>
<h2>無名関数 vs アロー関数</h2>

<button id="btn1">無名関数でクリック</button>
<button id="btn2">アロー関数でクリック</button>

<div id="output"></div>

<script>
// 出力用関数
function log(msg){
  const out = document.getElementById("output");
  const p = document.createElement("p");
  p.textContent = msg;
  out.appendChild(p);
}

// --- 無名関数の場合 ---
let counter1 = {
  name: "無名関数",
  value: 0,
  handleClick: function() {
    setTimeout(function(){
      this.value++; // this は setTimeout 内で window を参照
      log(this.name + " value=" + this.value); // undefined value=NaN
    }, 100);
  }
};
document.getElementById("btn1").addEventListener("click", function(){ counter1.handleClick(); });

// --- アロー関数の場合 ---
let counter2 = {
  name: "アロー関数",
  value: 0,
  handleClick: function() {
    setTimeout(() => {  // アロー関数は外側 this を使用
      this.value++;
      log(this.name + " value=" + this.value);
    }, 100);
  }
};
document.getElementById("btn2").addEventListener("click", function(){ counter2.handleClick(); });

// --- 配列操作のデモ ---
const nums = [1,2,3,4,5];
log("配列 nums = " + nums.join(", "));

// 無名関数で 2倍
const doubled1 = nums.map(function(x){ return x*2; });
log("無名関数で2倍: " + doubled1.join(", "));

// アロー関数で 2倍
const doubled2 = nums.map(x => x*2);
log("アロー関数で2倍: " + doubled2.join(", "));
</script>
</body>
</html>
HTML

✅ この演習でわかること

  1. 無名関数の this の挙動
    • ボタン1を押すと undefined value=NaN と出る
    • setTimeout 内の this がグローバルになるため
  2. アロー関数の this の挙動
    • ボタン2を押すと アロー関数 value=1 と正しく増える
    • 外側の this をそのまま参照できる
  3. 配列操作での書き換え
    • 無名関数とアロー関数で map した結果を比較

💡 練習アレンジ案

  • 配列の filter や reduce を同じく無名関数/アロー関数で書き換えて出力してみる
  • ボタンごとに counter を増減させて、this の違いを体感
  • setInterval を使って自動カウントで this の挙動を確認

See the Pen Comparative Exercise: Anonymous Functions vs. Arrow Functions by MONO365 -Color your days- (@monoqlo365) on CodePen.

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