はじめに
Javaの簡単な開発経験はあるもの、今のJavaScriptの現場で悪戦苦闘中。。。
本格的にJavaScriptを学ぶ必要があったので、アウトプットします。
気軽にコメントしていただいたり、間違えていることなどあれば気軽にご指摘ください。
励みになります。
【参考】自分のスペック
現時点(2022年12月現在)でのスペックです。
- IT経験3年
- 大学中退し、1年間求人広告の営業 → 未経験からSESへ
- 2019年11月からエンジニアとして現場に参画(2019年8月から3ヵ月は研修期間)
- システム運用(開発なし):1年
- テスター:半年
- 設計:4ヵ月
- 開発(Java):半年
- 開発(JavaScript):半年
- 要件定義:2ヵ月
- 資格:JavaGold SE8 (2020年3月)
なぜ歴史を学ぶのか
JavaScript自体が現在も発展途上ですし、歴史的経緯のせいで出きた仕様があったりします。
これらは
古い既存のソースコードの解読を助ける
用語の理解
などに役に立つと考えています。
【JavaScriptの歴史】ポイント
今回は自分が重要と思ったポイントのみを、備忘録として記載していきます。
【1990年代】もともとはブラウザに複雑な動きを加えるために開発された
ブラウザ(今でいうChromeやSafariなど)がない = 動かなかった
- ブラウザはJavaScriptエンジンを搭載している
- JavaScriptエンジンはJavaScriptを動かせる環境
- なので、なんの設定もしていないPCのコマンドプロンプトやターミナルでJavaScriptの記述をしても動かない
言語が柔軟に解釈する = 開発も楽になるやろ、的な発想でつくられた
- この柔軟性のせいで、バグが生まれやすくなった。なんてこったい。
- 変数の巻き上げや、undefinedが存在する意味
JavaScriptの担当外の処理→非同期処理の仕様にした
- 動作はすべてシングルスレッド
- 処理を一つ一つ順番に対処する
- 重い処理で画面が真っ白になる時間を短くする
- 画面が真っ白の状態で待たされて、イライラしてしまうのを防ぐ
- 他に任せてる間に自分の仕事を行う = 非同期処理
- 普通は書いた順に上から実行される = 同期処理 (想像通り)
- 【イメージ】電子レンジで温めている(非同期処理)最中に、皿洗いをする
- JavaScript担当外の処理:タイマー系/ 画像読み込み/API呼び出し...etc
【1990年代後半 ~ 2000年代前半】いろんな思惑で、JavaScriptの仕様がまとまらない
ブラウザ毎に好き勝手にJavaScriptの仕様を決めていた
- ブラウザの互換性がなかった
- ブラウザ毎にJavaScriptの仕様が異なっていた
JavaScript = コアな機能 + 各ブラウザの機能 をまとめたもの
- ECMAという標準化団体が、JavaScriptの標準化(ECMAScript)を作成していたが、第4版から各企業の意見が分裂した
- 各種ブラウザ専用のコードを書く必要があったとか。。。。
【2009年】Node.js 爆誕! でサーバサイドにも普及
サーバでもJavaScriptエンジンが動くようにすればいいんじゃね?的な天才的な発想で誕生
- シングルスレッド + 非同期処理 = 高速に処理ができる(待ち時間が少なくなる)
Node.jsのJavaScript環境 = コアな機能 + CommonJs
- 当時はJavaScriptで大規模な開発を行う想定ではなかったので、機能毎にファイルを分割する仕組みがなかった
- CommonJsでは上記の機能 = モジュールが追加された
- CommonJsではほかにも様々な機能がある
【2015年】JavaScriptのコアな機能がようやく標準化
ECMAScriptがようやくまとまる
- JavaScriptのコアな部分が統一され、様々な便利機能がECMAScriptに追加される
- 俗に言うES6(ES2015)
ECMAScriptはNode.jsの影響も受けている
- Node.jsのCommonJSの機能とECMAScriptの機能が重複している箇所がある
- 以下例
- CommonJSのモジュール機能(CJS)とECMAScriptのモジュール機能(ESM/ES Module)
まとめ
- ブラウザで複雑な動きをつけるために開発されたが、現在はそれに留まらず様々な場面で使用される
- JavaScriptは実行環境(ブラウザとNode.jsなど)によって、使える機能が異なる
ECMAScriptの仕様
【そのほか】JavaScriptエンジンの種類
該当の記事に記載がありますが、
これを覚えておくとブラウザのテストケースが省略できることがあるので便利です。
ちなみに、NodeJsのJavaScriptエンジンは
- V8エンジン(Chromeなどと同様)
を採用しています。
参考