【ITニュース解説】My Java Full Stack Journey Learning in JavaScript
2025年09月06日に「Dev.to」が公開したITニュース「My Java Full Stack Journey Learning in JavaScript」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
JavaScriptでサーバーと通信する`fetch()`やライブラリのAxios、関数の変数を記憶するクロージャは、Web開発に不可欠な機能である。これらは非同期処理や変数の有効範囲を理解する上で重要な概念だ。
ITニュース解説
提供された記事は「My Java Full Stack Journey Learning in JavaScript(JavaScriptで学ぶ私のJavaフルスタックの旅)」というタイトルを掲げているが、その中身は主にJavaScriptの特定の機能に焦点を当てて解説されている。フルスタック開発とは、ウェブアプリケーションのユーザーインターフェース(フロントエンド)から、データを処理し保存するサーバーサイド(バックエンド)まで、一連のシステム全体を開発できる能力を指す。このタイトルからはJavaを学ぶ旅路のようにも読み取れるが、実際には記事がJavaScriptのいくつかの重要な要素を解説していることから、JavaScriptがいかに現代のウェブ開発、特にフルスタック開発において不可欠な言語であるかを示唆しているのかもしれない。システムエンジニアを目指す上で、このような異なる言語や技術がどのように組み合わされ、そしてそれぞれがどのような役割を果たすのかを理解することは非常に重要だ。ここでは、記事で紹介されているJavaScriptの具体的な機能である「fetch()」「Axios」「クロージャ」について、その概念と使い方を詳しく解説する。これらは、ウェブアプリケーションがどのように外部と通信し、内部で情報を管理するかの基礎となる重要な技術だ。
まず、記事で紹介されているfetch()関数について解説する。ウェブアプリケーションは、表示するデータや処理結果を、インターネット上の別のコンピューター(これを「サーバー」と呼ぶ)とやり取りする必要がよくある。例えば、オンラインショッピングサイトで商品リストを表示したり、ユーザーが入力した情報をサーバーに保存したりするような場面だ。このようなサーバーとのデータのやり取りを「ネットワークリクエスト」と呼ぶ。fetch()は、JavaScriptを使ってこのネットワークリクエストを行うための、現代的で標準的な方法の一つだ。fetch()の大きな特徴は、その処理が「非同期」であることにある。非同期処理とは、データ取得などの時間がかかる処理を実行している間も、他の処理を停止せずにアプリケーションが動き続けることを意味する。これにより、ユーザーインターフェースがフリーズすることなく、快適な操作性が保たれる。fetch()関数は、処理の結果として「Promise(プロミス)」というオブジェクトを返す。Promiseは「将来的に何らかの処理が完了したら、その結果を教えてくれる」という約束のようなものだと考えると良い。Promiseには、処理が成功した場合と失敗した場合、それぞれの状況に応じた処理を記述できる仕組みが用意されている。成功した場合は.then()メソッドを使ってその後の処理を記述し、失敗した場合は.catch()メソッドを使ってエラー処理を記述する。記事の例では、fetch("https://fakestoreapi.com/products.json")でサーバーにリクエストを送信し、応答が返ってくると最初の.then()でres.json()を使って応答をJSON形式からJavaScriptオブジェクトに変換している。このres.json()もPromiseを返すため、さらに二番目の.then()で変換されたデータがrという変数に渡され、その内容がコンソールに出力される。もしネットワークエラーなどが発生した場合は.catch()が実行され、エラーがコンソールに出力される。このようにfetch()を使うことで、サーバーとのデータのやり取りを効率的かつエラーに強く記述できる。
次に、記事で紹介されているもう一つのネットワークリクエストを行うためのツールである「Axios(アクシオス)」について説明する。Axiosもfetch()と同様に、外部のAPI(アプリケーション・プログラミング・インターフェース)に対して非同期にリクエストを送り、データを取得したり送信したりするためのライブラリだ。fetch()がJavaScriptに標準で備わっている機能であるのに対し、Axiosは外部のライブラリであり、ウェブページに読み込むことで利用できるようになる。Axiosは「PromiseベースのHTTPクライアント」と紹介されている。Promiseベースである点はfetch()と同じで、非同期処理の結果をPromiseオブジェクトとして返すため、.then()や.catch()を使ったチェーン形式で処理を記述できる。HTTPクライアントとは、HTTP(Hypertext Transfer Protocol)というウェブ上での通信規約に則って、サーバーとデータのやり取りを行うためのプログラムや機能のことを指す。Axiosはfetch()よりも歴史が長く、より多くのブラウザや環境で動作するように設計されており、機能も豊富であることが多い。例えば、リクエストやレスポンスの自動的な変換機能、タイムアウトの設定、リクエストの中止機能など、fetch()では別途実装が必要な機能が最初から備わっているため、より複雑な通信処理を簡潔に記述できる点で人気がある。記事の例では、axios.get()を使ってhttps://cdn.jsdelivr.net/npm/axios/dist/axios.min.jsというURLからデータを取得しようとしている。このURLはAxiosライブラリ自体の配信元であり、通常は外部のAPIからデータを取得する際に利用される。この例では、サーバーからの応答があれば"res"という文字列をコンソールに出力し、エラーがあれば"error"を出力するようになっている。
最後に、JavaScriptの非常に重要な概念の一つである「クロージャ(Closure)」について解説する。クロージャは、JavaScriptで高度な機能やパターンを実現するために不可欠な要素であり、システムエンジニアとしてJavaScriptを扱う上で必ず理解しておくべきものだ。記事ではクロージャについて「内部関数が、それが作成された環境の変数を記憶している」と説明されている。JavaScriptでは、関数は別の関数の中に定義することができる。内側に定義された関数を「内部関数」、その内部関数を包含する関数を「外部関数」と呼ぶ。クロージャとは、この内部関数が、それが定義された「外部関数のスコープ(変数を参照できる範囲)」にある変数に、外部関数が実行を終えてもなおアクセスできる機能のことを指す。つまり、外部関数がその処理を終えても、内部関数は外部関数の環境を「閉じ込めて(close)」持ち続けている状態、とイメージできる。記事の例を見てみよう。accountという外部関数が定義されており、引数amountをbalanceという変数に初期値として設定している。その内部にはwithdrawという内部関数が定義されている。withdraw関数はamtという引数を受け取り、balanceからamtを引いた結果を新しいbalanceとして更新し、その値をコンソールに出力しようとしている(記事のbalance = balance.amt;という記述は、通常JavaScriptでは引き算を意味するbalance = balance - amt;が意図されていると考えられる)。account関数はwithdraw関数を「返している」点が重要だ。const withdraw1 = account(1000);が実行されると、account関数が呼び出され、balanceは1000で初期化される。そして、このaccount関数の中に定義されたwithdraw関数がwithdraw1に代入される。このとき、withdraw1(つまりwithdraw関数)は、それが作られた時の環境にあるbalance(値は1000)を「記憶」している。次にwithdraw1(50);が実行されると、withdraw1は記憶しているbalanceの1000から50を引き、950を出力する。const withdraw2 = account(500);が実行されると、account関数が再び呼び出され、今度は新しいbalanceが500で初期化される。このwithdraw2は、先ほどのwithdraw1とは全く独立した、新しい環境(新しいbalanceの値は500)を記憶している。withdraw2(100);が実行されると、withdraw2は記憶しているbalanceの500から100を引き、400を出力する。このように、クロージャを使うと、関数が独立した「状態」(この例ではbalance)を保持できるようになる。これは、オブジェクト指向プログラミングにおけるオブジェクトのプロパティ(属性)のように、それぞれが個別のデータを持ちながら操作できる柔軟なプログラムを書くことを可能にする。
この記事で紹介されたfetch()、Axios、そしてクロージャという3つのJavaScriptの技術は、一見するとそれぞれが独立した機能に見えるかもしれない。しかし、これらは全て現代のウェブアプリケーション開発において、データとどのように関わり、どのように効率的に処理を行うかという点で密接に関連している。fetch()やAxiosは、アプリケーションが外部のデータソースと通信するための「窓口」であり、クロージャは、その通信を通じて取得したデータをアプリケーション内部でどのように「管理・保持」していくかという「仕組み」を提供する。システムエンジニアを目指す上で、これらの技術の基本的な概念を理解し、実際にコードを書いてみることが非常に重要だ。ウェブアプリケーションは常に進化しており、新しい技術やフレームワークが登場し続けるが、これらの核となるJavaScriptの基礎知識は、どのような環境でも応用が効く強力な土台となるだろう。実際に手を動かしてコードを書く楽しみを見つけ、これらの技術を深く探求していくことが、確かなスキルを身につける第一歩となる。