JavaScript
JavaScript = ECMAScript + 環境ごとに異なる仕様
ブラウザ環境
ECMAScript + Web APIs(DOM APIなど)
Node.js環境
ECMAScript +CommonJS
ECMAScript
JavaScriptのコアの部分をECMAScriptとして仕様策定
JavaScriptの一部がECMAScript
JavaScriptエンジン
ECMAScriptを実装する
例
Chrome
V8エンジン + WebAPI(Fetch API、DOM API、WebRTCなど)
V8エンジン = JavaScriptエンジン(ECMAScriptを実装する)
JavaScriptエンジンによって実行結果が微妙に異なることがある
コードが実行されるまで
JavaScriptエンジン
コード
グローバルオブジェクト
ブラウザではwindowなど
Web APIを含む
this
実行コンテキストによってthisで取得できるものは変わる
グローバルコンテキスト
JavaScriptファイル直下のコンテキスト
使えるもの
実行中のコンテキスト内の変数、関数
グローバルオブジェクト
this
関数コンテキスト
関数のブロック内のコンテキスト
使えるもの
実行中のコンテキスト内の変数、関数
arguments
super
this
外部変数
evalコンテキスト
コールスタック
実行中のコードがたどってきたコンテキストの積み重ね
コールスタックの一番上にあるコンテキストが実行中のコンテキスト
ホスティング
コンテキスト生成時に実行される
コンテキスト内で宣言した変数や関数の定義を、コード実行前にメモリに配置すること
変数
var
宣言だけ先に行う。メモリの確保をして、ホスティング時にundefinedで初期化する
let, const
ホスティング時にundefinedで初期化されない
関数
ソースコード内で、呼び出しが宣言より先になっていたとしても、実行時には宣言を先にメモリにロードしてくれるから、呼び出しはできる
strict mode
"use strict"という文字列をファイルまたは関数の先頭に書くことで、そのスコープにあるコードはstrict modeで実行される
evalやwithとかを使えなくする
var, let, const
constは再代入、再定義が共に不可
letは再定義が不可
var は再代入も再定義もできる
データ型
プリミティブ型とオブジェクト
プリミティブ型はイミュータブル
オブジェクトはミュータブル
値そのものではなく値への参照を経由して操作
nullリテラル
nullは「値がない」ということを表現する値
値がないという値をもつ
undefined
undefinedという値をもったグローバル変数
code:js
const undefined = "独自の未定義値"; // undefinedという名前の変数をエラーなく定義できる
console.log(undefined); // => "独自の未定義値"