Twitter hashtag: #esspec
便利ツール
自己紹介 (近況報告)
syumai
明後日発売のSoftware Designに記事がのります
tars0x9752.icon 👏👏👏
久々に200 starつきそう
tars0x9752.icon おめでとうございます!
noyan.iconかっこいいです🎉
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
部屋が夏ばりに暑くてクーラーを付けたました(今)
クーラーを使っていきます!
noyannoyan.icon
新卒のメンターになるからと仕事を頑張ったら、無理が祟って風邪をひきました
yebis0942yebis0942.icon
YAPC::Kyotoの録画が公開されていた
JavaScriptのASTの話もあって不思議
tars0x9752.icon 気になる
ikutaNozomuIkuta.icon
久しぶりに参加したらみんなが宇宙語を話している
ECMAScript 2023が公開されて、tc39.esは2024 Draftになりました🎍🎍🎍
前回のあらすじ
GlobalEnvironmentRecord
OK: var undefined = 1, NG: let undefined = 1
globalThisがIsExtensibleかどうかによって振る舞いが変わる例
ModuleEnvironmentRecord
今回の範囲
9.2.1 PrivateEnvironment Record Operations から始め、9.3 Realmsに入っていきます
PrivateEnvironment Records
PrivateEnvironment Record Operations
NewPrivateEnvironment
ResolvePrivateIdentifier
Assert: outerPrivEnv is not null.
アルゴリズム上はnot nullであることが保証されないように見える
このような条件が成立する場合しか呼び出されないという意味か?
呼び出し元を辿っていったが、利用シーンがあまり分からない…
名前が見つからない場合の対応がない気がする
code:js
class A {
a() {
this.#z = 2; // class の宣言時点で失敗している
}
}
9.3 Realms
ECMAScriptコードは評価以前にどれか一つのrealmと結びついていなければならない。
Realmとは、intrinsic object, global environmentなどのセットで構成される。
Conceptually, a realm consists of a set of intrinsic objects, an ECMAScript global environment, all of the ECMAScript code that is loaded within the scope of that global environment, and other associated state and resources.
[[Intrinsics]]
このrealmに紐づいてるコードで使われる intrinsic values
[[GlobalObject]]
The global object for this realm
[[GlobalEnv]]
The global environment for this realm
[[TemplateMap]]
template string literalで参照される値
疑問: なぜrealmの単位で管理しているんだろうか?
[[LoadedModules]]
[[HostDefined]]
Hostが使用するためのフィールド
CreateRealm
CreateIntrinsics して[[GlobalObject]] [[GlobalEnv]] を undefined にして [[TemplateMap]] を空のリストにして realm を作る
[[LoadedModules]]は初期化忘れてるのではないか説
CreateIntrinsics
Step2がすごく長い
functionのlengthは引数の数
Perform AddRestrictedFunctionProperties(realmRec.[[Intrinsics]].[[%Function.prototype%]], realmRec).
function.prototype.caller, calleeを参照不可にしている
SetRealmGlobalObject
前回見たglobalThisが切り替わる挙動と関係していそう
InitializeHostDefinedRealm
Node.jsは、host defined realmのthis valueとして、Global Environment Recordを作る度に空のObjectを生成してそう
GlobalThisValue は、globalThisのことではなかった!
code:js
~/go/src/github.com/syumai/til/js/esspec2(main ✗) cat b.js
this.b = 1;
console.log(this);
~/go/src/github.com/syumai/til/js/esspec2(main ✗) cat a.js
require('./b.js');
this.a = 1;
console.log(this);
~/go/src/github.com/syumai/til/js/esspec2(main ✗) node a.js
{ b: 1 }
{ a: 1 }
SetDefaultGlobalBindings
global object に対して name と property descriptor とかを define するやつ
Execution Context
(英語) a specification device
「仕様上の仕組み」
(英語) execution context is a specification device that is used to track the runtime evaluation of code by an ECMAScript implementation
byはどこに掛かるか
used?evaluation?
the surrounding agent
agentはexecution contextを包み込んで (surroundして) いる
疑問: 実行コンテキストは具体的にはどんなふうに使われているのか?
executuion context stack
一番上が running execution context
新しい execution context が作られてコントロールが移る度に stack に積まれて、一番上のやつが running execution context になる
疑問: function 毎に exection context がありそう??
疑問: execution contextはどういうときにsuspend/resumeされるのか