グローバル変数からコールバック関数まで!JavaScript 関数間で値を渡す7つの方法

2024-06-26

JavaScript 関数に引数を渡して別の関数に値を渡す方法

引数の渡し方

関数を呼び出す際に、関数のカッコ内にカンマ区切りで引数を渡します。

function greet(name) {
  console.log("こんにちは、" + name + "さん!");
}

greet("山田"); // 処理結果:こんにちは、山田さん!

上記の例では、greet 関数に name という引数を渡しています。関数内では、渡された引数 name を使って挨拶のメッセージを出力しています。

複数の引数

関数に複数の引数を渡すこともできます。

function calculateArea(width, height) {
  return width * height;
}

const area = calculateArea(5, 3);
console.log(area); // 処理結果:15

上記の例では、calculateArea 関数に widthheight という2つの引数を渡しています。関数内では、渡された引数を使って長方形の面積を計算し、その結果を戻り値として返しています。

戻り値の受け取り

別の関数で戻り値を受け取るには、関数呼び出しの後にカッコをつけて値を代入します。

function square(number) {
  return number * number;
}

const result = square(10);
console.log(result); // 処理結果:100

上記の例では、square 関数から返された戻り値を result 変数に代入しています。

関数同士の連携

引数と戻り値を活用することで、複数の関数を連携させて処理を行うことができます。

function calculateCircleArea(radius) {
  return Math.PI * radius * radius;
}

function displayCircleInfo(radius) {
  const area = calculateCircleArea(radius);
  console.log("半径 " + radius + " の円の面積は " + area + " です。");
}

displayCircleInfo(5); // 処理結果:半径 5 の円の面積は 78.53979477294144 です。

上記の例では、calculateCircleArea 関数は円の面積を計算し、displayCircleInfo 関数は円の半径と面積を表示します。displayCircleInfo 関数は calculateCircleArea 関数の戻り値を利用して円の面積を取得しています。

このように、引数と戻り値を組み合わせることで、JavaScript 関数を効果的に連携させ、複雑な処理を行うことができます。

  • 関数には引数を省略したり、デフォルト値を設定したりすることもできます。
  • 関数は再帰的に呼び出すこともできます。
  • 関数はオブジェクトとしてプロパティやメソッドを持つことができます。

詳しくは、以下のリソースを参考にしてみてください。




    円柱の体積と表面積を計算するプログラム

    このプログラムでは、円柱の半径と高さを引数として受け取り、円柱の体積と表面積を計算し、結果を表示します。

    function calculateCylinderVolume(radius, height) {
      const baseArea = Math.PI * radius * radius;
      const volume = baseArea * height;
      return volume;
    }
    
    function calculateCylinderSurfaceArea(radius, height) {
      const baseArea = Math.PI * radius * radius;
      const lateralArea = 2 * Math.PI * radius * height;
      const surfaceArea = 2 * baseArea + lateralArea;
      return surfaceArea;
    }
    
    function displayCylinderInfo(radius, height) {
      const volume = calculateCylinderVolume(radius, height);
      const surfaceArea = calculateCylinderSurfaceArea(radius, height);
      console.log("半径 " + radius + "、高さ " + height + " の円柱:");
      console.log("  体積:" + volume);
      console.log("  表面積:" + surfaceArea);
    }
    
    const radius = 5;
    const height = 10;
    
    displayCylinderInfo(radius, height);
    

    このプログラムは以下の処理を実行します。

    1. calculateCylinderVolume 関数:円柱の体積を計算し、戻り値として返します。
    2. displayCylinderInfo 関数:円柱の半径と高さを表示し、calculateCylinderVolume 関数と calculateCylinderSurfaceArea 関数から返された体積と表面積を表示します。
    3. プログラム実行時に、半径 5、高さ 10 の円柱について、体積と表面積を displayCylinderInfo 関数を使って表示します。

      これらのサンプルコードを参考に、さまざまな処理を関数に分割して、プログラムをより分かりやすく、再利用しやすくすることができます。




      JavaScript 関数間で値を渡すその他の方法

      グローバル変数

      最もシンプルな方法は、関数間で共有したい変数をグローバル変数として宣言することです。

      let globalValue = 10;
      
      function function1() {
        console.log(globalValue); // 10 を出力
        globalValue = 20;
      }
      
      function function2() {
        console.log(globalValue); // 20 を出力
      }
      
      function1();
      function2();
      

      利点:

      • シンプルで分かりやすい
      • コードが分かりにくくなり、意図しない値変更が起こりやすい
      • テストが困難になる
      • コードの再利用性が低くなる

      クロージャ

      関数内で宣言された変数に外部からアクセスできるようにする仕組みです。

      function createCounter() {
        let count = 0;
        return function() {
          count++;
          return count;
        };
      }
      
      const counter1 = createCounter();
      const counter2 = createCounter();
      
      console.log(counter1()); // 1 を出力
      console.log(counter1()); // 2 を出力
      console.log(counter2()); // 1 を出力
      
      • 関数内で宣言された変数を外部から参照・変更できる
      • プライベートな変数を保持できる
      • コードが分かりにくくなる場合がある

      コールバック関数

      非同期処理の結果を処理する関数を引数として渡す方法です。

      function loadFile(fileName, callback) {
        // ファイルを読み込む処理
        const data = // ファイルの内容
      
        // 読み込み完了後にコールバック関数を呼び出す
        callback(data);
      }
      
      loadFile("data.txt", function(data) {
        console.log(data);
      });
      
      • 非同期処理の完了後に処理を実行できる
      • コードをモジュール化しやすい

        イベントリスナー

        DOM イベントなどのイベントを発生させた要素にイベントハンドラを設定する方法です。

        const button = document.getElementById("button");
        
        button.addEventListener("click", function() {
          console.log("ボタンがクリックされました");
        });
        
        • GUI 操作などのイベントを処理しやすい

          適切な方法の選択

          • シンプルで分かりやすい方法が必要な場合は、グローバル変数が適しています。
          • プライベートな変数を保持したり、関数内で宣言された変数を外部から参照・変更する必要がある場合は、クロージャが適しています。
          • 非同期処理の完了後に処理を実行する必要がある場合は、コールバック関数が適しています。
          • GUI 操作などのイベントを処理する必要がある場合は、イベントリスナーが適しています。

          上記以外にも、Promiseasync/await などの非同期処理を扱うための方法もあります。状況に応じて適切な方法を選択することで、より柔軟で maintainable なコードを書くことができます。


          javascript


          JavaScriptとjQueryで要素内のテキストを選択する方法

          このページでは、JavaScriptとjQueryを使って、要素内のテキストを選択する方法を解説します。HTMLInputElement オブジェクトには、select() メソッドという、テキストを選択するためのメソッドがあります。このメソッドは、要素内のすべてのテキストを選択します。...


          【保存版】jQueryでhref属性値を取得する方法を徹底解説!サンプルコード付き

          このチュートリアルでは、jQuery を使って HTML の <a> タグの href 属性値を取得する方法を説明します。方法href 属性値を取得するには、以下のいずれかの方法を使用できます。attr() メソッドを使う最も一般的な方法は、attr() メソッドを使用する方法です。このメソッドは、要素から属性値を取得するために使用されます。...


          JavaScript 初心者でも安心!配列からランダム値を取得する方法

          Math. random() と Math. floor() を使う方法Math. random() 関数を使い、0から配列の長さまでのランダムな浮動小数点数を得ます。Math. floor() 関数を使って、その浮動小数点数を整数に切り捨てます。...


          【JavaScript】in 演算子、hasOwnProperty メソッド、オプション型ガード:それぞれの利点と欠点

          JavaScript において、オブジェクトのプロパティの存在を確認することは、プログラミングにおいて重要な場面でよく用いられます。特に、変数にプロパティ名を持ち、そのプロパティがオブジェクトに存在するかどうかを判定したいケースは頻繁に発生します。...


          React.forwardRefとカスタムrefプロップの使い分け:迷ったらコレ!

          React でコンポーネントに参照 (ref) を渡すには、主に 2 つの方法があります。React. forwardRef: React 16. 3 で導入された標準的な方法で、コンポーネントを forwardRef 関数でラップすることで実現します。...