メインコンテンツまでスキップ

inazuma code :関数

関数 とは、ひとかたまりの処理に名前をつけて再利用できる仕組みです。 一度定義すれば、異なる場所から何度でも呼び出して実行できます。

inazuma code では、関数は 第一級オブジェクト として扱われます。 そのため、関数を変数に代入したり、他の関数に引数や戻り値として渡せます。

関数定義には アロー関数構文 を使用します。

ブロック内で 最後に評価された式の値 が、そのまま関数の戻り値となります。 明示的な return は不要です。

アロー関数の定義

// 引数なし
let greet = () => "Hello, World!";

// 単一の引数(括弧省略可)
let square = x => x * x;

// 複数の引数
let multiply = (a, b) => a * b;

// ブロック式(複数行)
let productSquared = (a, b) => {
let x = a * b;
x * x;
};

// クロージャ(変数キャプチャ)
let base = 10;
let addBase = x => x + base;

関数呼び出し

// 引数なし
greet(); // "Hello, World!"

// 引数あり
square(5); // 25
add(1, 2); // 3

// 式や計算結果も渡せる
double(3 + 4); // 14

// 可変長引数
sum(1, 2, 3); // 6
sum(1 + 2, 3 * 4); // 15

関数の戻り値にアクセス

関数呼び出し結果が配列やオブジェクトの場合、そのままプロパティや要素にアクセスできます。

foo(2, 3)[3] + 4;
foo(2, 3).bar[3] + 4;

パイプライン演算子(|>

パイプライン演算子を使うと、関数呼び出しを左から右へ直感的に書けます。

foo |> bar |> baz;

// 引数付き
foo |> bar(2) |> baz(3);

これは次のように評価されます。

baz(bar(foo, 2), 3)

メソッド呼び出し

オブジェクトのプロパティとして関数が格納されている場合、. で呼び出せます。

obj.method();
obj.greet("Alice");
obj.add(3, 4);

ネスト呼び出し:

obj.nested().say(); // ネストしたオブジェクトのメソッド呼び出し

オプショナルチェイニング:

obj.undefinedMethod?.(); // 存在しない場合は null
obj.getNull()?.say(); // getNull() が null なら安全に終了

キャプチャとクロージャ

関数は外側のスコープの変数を参照できます(クロージャ)。

let x = a => b => a + b;
let addTwo = x(2);
addTwo(3); // 5
まとめ
  • アロー関数構文を使用します。((args) => { ... } または (args) => 式
  • ブロック形式と式形式をサポートしています。
  • ブロック内で 最後に評価された式の結果 が、関数の実行結果になります。
  • 外側のスコープの変数をキャプチャできます。(クロージャ)
  • 関数は値として扱え、変数代入や関数引数にできます。
  • パイプライン演算子で直感的な関数適用が可能です。
  • オブジェクトのメソッド呼び出しと、オプショナルチェイニングに対応しています。