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) => 式
) - ブロック形式と式形式をサポートしています。
- ブロック内で 最後に評価された式の結果 が、関数の実行結果になります。
- 外側のスコープの変数をキャプチャできます。(クロージャ)
- 関数は値として扱え、変数代入や関数引数にできます。
- パイプライン演算子で直感的な関数適用が可能です。
- オブジェクトのメソッド呼び出しと、オプショナルチェイニングに対応しています。