Twitter hashtag: #esspec
便利ツール
時事ネタ
ES2023に取り込まれるProposalがfixしたっぽい?
petamorikenさんがTC39の会議の記録をまとめてくださっているらしい
自己紹介 (近況報告)
syumai
スラムダンクを箱買いして読み、映画も見ました
Go Documentation 輪読会を不定期開催
Jun Yasumura / harupiyo Jun Yasumura.icon
CSSの知識をアップデート中
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
今週末にあるとある楽曲投稿イベントに向けて準備をしている
noyannoyan.icon
Testing Playground(Testing Libraryのもろもろ)があって便利そう
このDOMは screen.getByLabelText(/password/i) でテストすればいいよ!みたいに提案してくれる
業務でアプリケーションをあまり書かないので、使ってないけど紹介しました
前回のあらすじ
今回の範囲
9. Environment Records から
Environment Records
識別子と特定の関数変数の間の関連を定義するのに使われる
ECMAScirpt のコードのレキシカル(字句)なネスト構造に基づいて関連付けが行われる
関数宣言やブロック文、トライ文のキャッチ節などに紐づく
そのようなコードが評価されるたびに新しい Environment Records が作られる
Environment Records が作られる理由は、そのコードによって作られた識別子の束縛を記録するため
[[OuterEnv]] field
全ての Environment Records は [[OuterEnv]] field を持つ
null または reference to an outer Environment Record
Environment Record values の論理的なネスティングをモデルするために使われる
内側がもってる参照は論理的に外側への参照
一つの Environment Record は内側にある複数の Environment Records の OuterEnv としてなる可能性をもつ
仕様書だけの概念
The Environment Record Type Hierarchy
Environment Record は単純なオブジェクト指向のヒエラルキーに存在するというように考えることができる
Environment Record は 3 つのサブクラスをもつ抽象クラス
Environment Record (abstract)
Declarative Environment Record
Function Environment Record
関数の呼び出しに対応し、関数内のトップレベルの宣言を束縛をもつ
super() をサポートするのに必要なステートもキャプチャーする
Module Environment Record
Object Environment Record
Global Environment Record
abstract specification methods
それぞれの具体的なサブクラスでそれぞれ明確にことなったアルゴリズムをもってる
HasBinding(N):
Environment Recordが変数名Nへの束縛をもつか判定する
CreateMutableBinding(N, D)
新たにMutable Bindingを作成するが初期化しない
CreateImmutableBinding(N, S)
新たにImmutable Bindingを作成するが初期化しない
InitializeBinding(N, V)
すでに存在するが uninitialized な binding を初期化する
SetMutableBinding(N, V, S)
すでに存在する mutable binding の値セットする
GetBindingValue(N, S)
存在する binding の値を返す
Sがfalseだと存在しない値にもReferenceErrorを投げないってコト...!?
DeleteBinding(N)
HasThisBinding()
HasSuperBinding()
WithBaseObject()
Declarative Environment Records
think a as b : aをbとして考える
SetMutableBinding
code:js
(function() {
eval(`
// 1. CreateMutableBinding("x", true)
var x;
// 3. SetMutableBinding("x", 0, false)
x = (
// 2. DeleteMutableBinding("x")
delete x,
0
);
`);
console.log(x);
})();
//シンプルな例
(function() {
var x;
delete x;
x = 0;
console.log(x);
})();
// strict mode
(function() {
'use strict';
var x;
delete x; // VM696:4 Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
x = 0;
console.log(x);
})();
// strict mode
(function() {
'use strict';
x = 0; // Uncaught ReferenceError: x is not defined
})();
// a は strict、nestされた関数でSetMutableBinding(S = false)だが、strict mode扱いになる
(function() {
"use strict";
const a = 1;
(function() {
a = 2; // VM1491:5 Uncaught TypeError: Assignment to constant variable.
})();
})();
// uninitializedなbindingに値を設定する例を書こうとしたが、var xの時点で初期化済みだったので失敗
(function() {
var x; // MutableBinding(BoundValue: undefined, initialized: true)
x = 1; // SetMutableBinding("x", 1)
})();
// おまけ (終了後に追記)
// uninitializedなbindingにSetMutableBindingしようとして失敗するパターンは、class宣言などで存在する
class A extends (function() {
A = 1 // Uncaught ReferenceError: Cannot access 'A' before initialization
})() {
}