JavaScriptの関数宣言と関数式の違いとは?基本をわかりやすく解説
JavaScriptでは、関数を定義する方法として主に「関数宣言(Function Declaration)」と「関数式(Function Expression)」の2つがあります。どちらも同じように動作する関数を作成できますが、構文や挙動には重要な違いがあります。この記事では、それぞれの特徴と具体的な書き方をコード例とともに解説します。
関数宣言(Function Declaration)
JavaScriptでは「function」キーワードを使って関数を宣言します。関数を定義する際は、「function」キーワードに続けて、一意な関数名、パラメータのリスト(空でも可)、そして波括弧 { } で囲まれた処理ブロックを記述します。
以下がその例です。
function sayHello(name, age) {
document.write(name + " is " + age + " years old.");
}
関数宣言の大きな特徴は「巻き上げ(ホイスティング)」です。関数宣言はコードの実行前に読み込まれるため、定義より前の行から呼び出しても正常に動作します。
関数式(Function Expression)
一方、関数式は文の先頭を「function」キーワードで始めません。通常は変数に代入する形で定義し、関数名を持つ「名前付き関数式」と、名前を持たない「無名関数式(匿名関数)」のどちらでも定義できます。
まずは無名関数式の例です。
// 無名関数式
var a = function() {
return 5;
}
次に、名前付き関数式の例です。
// 名前付き関数式
var a = function bar() {
return 5;
}
関数式の場合、変数への代入が完了するまで呼び出すことができません。つまり、定義より前の行で呼び出すとエラーになるため、記述順序に注意が必要です。
使い分けのポイント
関数宣言は巻き上げにより柔軟に使える一方、関数式は変数に格納できるため、コールバック関数や即時実行関数(IIFE)などで活用されます。用途に応じて適切な方法を選択しましょう。
-
JavaScriptの名前付き関数式とは?実装方法と動作をわかりやすく解説
名前付き関数式(Named Function Expression)とはJavaScriptでは、関数式に対して名前を付けることができます。これを「名前付き関数式」と呼びます。通常の無名関数式と異なり、付けた名前はその関数の内部でのみ参照可能という特徴があります。この仕組みを活用すると、以下のようなメリットがあります。関数内部から自分自身を呼び出す再帰処理が書きやすくなるデバッグ時のスタックトレースに関数名が表示され、エラー箇所の特定が容易になるサンプルコード以下は、オブジェクトのプロパティとして名前付き関数式「factorial」を定義し、階乗を計算する例です。<!DOCTYPE ht
-
JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説
JavaScriptでは、call()、apply()、bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。 3つのメソッドの違い call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。 apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。 bind():thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン