JavaScript関数を完全マスター|宣言・アロー関数・スコープ・クロージャまでやさしく解説

4 min 44 views
JavaScript関数

JavaScriptの関数って、正直なんとなくしか分かってないかも…
そう感じたこと、ありませんか?

Web制作やフロントエンド開発を学び始めると、必ずぶつかるのが「関数」という壁。
書けるようにはなったけれど、「宣言と式の違い」「アロー関数の使いどころ」「スコープやクロージャの仕組み」になると、急に難しく感じてしまう人も多いはずです。

でも安心してください。
この記事では、関数の基本から応用までを、“腑に落ちる”順番で丁寧に解説します。

✔️ Web制作・フロントエンドを仕事にしたい
✔️
JavaScriptを基礎からやり直したい
✔️
Reactなどのフレームワークに進む前に土台を固めたい

そんなあなたにこそ、最後まで読んでほしい内容です。

関数(function)とは、「一連の処理をひとまとめにして、名前をつけて再利用できる」仕組みのことです。
たとえば「挨拶を表示する」「合計を出す」など、何度も使う処理を関数にまとめると、コードが整理され、保守がとても楽になります。

function greet(name) {
  return `こんにちは、${name}さん!`;
}
console.log(greet("アキラ")); // → こんにちは、アキラさん!

ポイント
関数を使うと「何をしているか」が明確になるため、後から読んだ人にも理解しやすくなります。

 2-1. 関数宣言(最も一般的)

function add(a, b) {
  return a + b;
}
console.log(add(3, 4)); // 7

functionキーワードで始まり、定義より前でも呼び出せるのが特徴です(「巻き上げ=ホイスティング」)。
ただし可読性のため、基本的には定義を上に書くのがおすすめです。

 2-2. 関数式(変数に関数を代入)

const mul = function (a, b) {
  return a * b;
};

この形は「関数も値の一種」というJavaScriptの特徴を活かした書き方です。
代入前に呼び出すとエラーになる点に注意してください。
関数式は、動的に関数を切り替えたり、引数として関数を渡すときによく使われます。

 2-3. アロー関数(短く・シンプルに書ける)

const div = (a, b) => a / b;

functionを省略し、=>(矢印)で定義するモダンな書き方。
短いコールバック関数や無名関数を定義する場面で便利です。

⚠️ 注意
アロー関数は「this」を持たず、外側のthisを参照します。そのため、オブジェクトのメソッド定義には不向きなことがあります。

 3-1. デフォルト引数

function greetUser(name = "ゲスト") {
  console.log(`こんにちは、${name}さん!`);
}
greetUser(); // こんにちは、ゲストさん!

値が渡されなかったときの“保険”として、初期値を設定できます。

 3-2. 可変長引数(restパラメータ)

const sum = (...nums) => nums.reduce((total, n) => total + n, 0);
console.log(sum(2, 4, 6, 8)); // 20

引数がいくつでもOK。...を使うと配列として受け取れます

 3-3. 分割代入(オブジェクトをそのまま引数に)

function showProfile({ name, age }) {
  console.log(`${name}さんは${age}歳です`);
}
showProfile({ name: "ユウキ", age: 28 });

オブジェクトの中身をわかりやすく取り出せるテクニックです。
Reactなどのフレームワークでも頻出します。

function getDiscount(price) {
  if (price > 10000) return "10% OFF";
  return "対象外";
}
console.log(getDiscount(12000)); // 10% OFF

returnで関数の結果を外へ返します。
returnの後の処理は実行されないため、「早期リターン」で条件を明確にするのが良い書き方です。

スコープとは「変数が使える範囲」のこと。
letconstブロック単位var関数単位で有効です。

function example() {
  let x = 10;
  if (true) {
    let y = 20;
    console.log(x + y); // OK
  }
  // console.log(y); // ❌ エラー:スコープ外
}

💡 ポイント
varは古い仕様なので、基本的にletconstを使うのが現代的です。

const obj = {
  count: 0,
  normal: function () { return this.count; },
  arrow: () => this.count
};
console.log(obj.normal()); // 0
console.log(obj.arrow());  // undefined

アロー関数は「外側のthis」を参照するため、オブジェクト内で使うとundefinedになることがあります。
メソッドとして使う場合はfunction式を使いましょう。

関数は値なので、他の関数に「渡す」こともできます。

const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(n => n * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

.map().filter()などは、関数を引数として受け取る「高階関数」です。
慣れてくるとコードの見通しが圧倒的に良くなります。

function counter() {
  let count = 0;
  return () => ++count;
}
const click = counter();
console.log(click()); // 1
console.log(click()); // 2

関数が「定義されたときのスコープ」を保持するため、外の変数を覚え続けます。
状態管理やモジュールパターンに応用できます。

(() => {
  console.log("最初に一度だけ実行");
})();

一度だけ実行したい初期化処理などで使用します。
グローバル変数を汚さない安全な書き方です。

async function fetchData() {
  const res = await fetch("https://api.example.com/data");
  const data = await res.json();
  console.log(data);
}
fetchData();

asyncをつけると、関数の中でawaitが使えます。
非同期処理を「同期的」に書けるため、コールバック地獄を避けられます。

  • constをデフォルトで使う
  • 関数名は「動詞+目的語」(例:getUserInfo
  • 1つの関数に1つの責務(SRP原則)
  • コールバックにはアロー関数を使って可読性を上げる
  • forEachよりmapfor...ofを優先

関数を使いこなすことは、JavaScriptの第一歩。
書き方(宣言・式・アロー)、引数の柔軟性、スコープ、クロージャ、非同期処理などを理解すると、コードの品質が飛躍的に上がります。

created by Rinker
¥5,060 (2025/11/04 14:14:47時点 楽天市場調べ-詳細)
関連記事