1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【JavaScript】関数式と高階関数 - 関数を値として扱う柔軟性

Posted at

はじめに

JavaScriptが他の多くのプログラミング言語と異なる点の一つに、関数を値として扱える柔軟性があります。これは関数式と高階関数という機能によって実現されており、JavaScriptの汎用性を大きく高めている要素です。

この記事では、関数式の基本から高階関数の活用まで、JavaScriptにおける関数の柔軟な扱い方について解説します。

関数式とは

JavaScriptには関数を定義する方法が複数ありますが、その中でも関数式は変数に代入できる形式の関数定義です。

// 通常の関数宣言
function greet() {
  console.log("こんにちは");
}

// 関数式
const greet = function() {
  console.log("こんにちは");
};

関数式の最大の特徴は、関数を値として扱える点にあります。これにより、変数への代入や関数の引数として渡すことが可能になります。

関数式の強み - 変数に代入できる

関数式は変数に代入できるため、通常の値と同じように扱えます。これがJavaScriptの柔軟性を支える重要な仕組みです。

const add = function(a, b) {
  return a + b;
};

const subtract = function(a, b) {
  return a - b;
};

// 変数として関数を扱える
let operation = add;
console.log(operation(5, 3)); // 8

operation = subtract;
console.log(operation(5, 3)); // 2

このように、実行時に異なる関数を変数に割り当てることで、プログラムの動作を動的に変更できます。

動的な関数生成

関数式のもう一つの強力な機能は、ループ内で動的に関数を作成できることです。

const multipliers = [];

for (let i = 1; i <= 3; i++) {
  multipliers.push(function(x) {
    return x * i;
  });
}

console.log(multipliers[0](10)); // 10を1倍
console.log(multipliers[1](10)); // 10を2倍
console.log(multipliers[2](10)); // 10を3倍

このように、プログラムの実行中に必要な関数を生成できるのは、関数式ならではの利点ですね。

高階関数 - 関数を引数に渡す

高階関数とは、関数を引数として受け取ったり、関数を返り値として返す関数のことです。まずは関数を引数として渡すパターンを見てみましょう。

function executeOperation(operation, a, b) {
  return operation(a, b);
}

const add = function(x, y) {
  return x + y;
};

const multiply = function(x, y) {
  return x * y;
};

console.log(executeOperation(add, 5, 3));      // 8
console.log(executeOperation(multiply, 5, 3)); // 15

ポイントは、引数として関数名を渡すことです。関数に()を付けて実行してしまわないよう注意が必要です。

配列のメソッドであるmapfilterreduceなども高階関数の代表例です。

const numbers = [1, 2, 3, 4, 5];

// filter: 条件を満たす要素だけを抽出
const evenNumbers = numbers.filter(function(num) {
  return num % 2 === 0;
});

console.log(evenNumbers); // [2, 4]

高階関数 - 関数を返り値として返す

関数式は返り値としても返すことができます。これにより、関数を動的に生成する高度な処理が実現できます。

function createMultiplier(multiplier) {
  return function(x) {
    return x * multiplier;
  };
}

const double = createMultiplier(2);
const triple = createMultiplier(3);

console.log(double(5));  // 10
console.log(triple(5));  // 15

この例では、createMultiplier関数が新しい関数を生成して返しています。生成された関数は、それぞれ異なる倍数を持つ独立した関数として機能します。

条件式を組み合わせることで、より複雑な関数生成も可能です。

function createValidator(minLength) {
  return function(text) {
    return text.length >= minLength;
  };
}

const isValidPassword = createValidator(8);
const isValidUsername = createValidator(4);

console.log(isValidPassword("abc123"));    // false
console.log(isValidPassword("abc12345"));  // true
console.log(isValidUsername("abc"));       // false
console.log(isValidUsername("abcd"));      // true

条件式が満たされるときにはtrue、満たされないときにはfalseが返るバリデーション関数を動的に作成できます。

まとめ

JavaScriptにおける関数式と高階関数は、関数を値として扱える柔軟性を提供します。

  • 関数式により、関数を変数に代入できる
  • ループ内で動的に関数を生成できる
  • 高階関数により、関数を引数として渡せる
  • 関数を返り値として返すことで、条件に応じた関数を動的に生成できる

これらの機能を理解することで、より柔軟で保守性の高いコードを書けるようになります。JavaScriptの汎用性の高さは、こうした関数の扱いやすさに支えられているのです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?