Twitter hashtag: #esspec
便利ツール
自己紹介 (近況報告)
syumai
Cloudflare D1 サポート入れました
久々に色々な方に会えてよかった
原稿の締め切りがヤバい
頑張ります
最近仕事ではずっとWindow Object間のメッセージングの実装をしてます
Jun Yasumura / harupiyo Jun Yasumura.icon
忙しさがやわらいできた
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
30回おめでとうございます(?)
今週末にあるとある楽曲投稿イベントに参加するべく準備を進めている
半年以上前にだしたPRに対するレスポンスが来たがなにも覚えていない
yebis0942yebis0942.icon
YAPC::Kyoto 2023行きます
前回のあらすじ
メモ: with文にProxyオブジェクトを渡したらどうなる?
code:js
const wrapped = new Proxy({}, { get: () => 47 });
console.log(wrapped.fooo); // 47
with(wrapped) { console.log(fooo); } // reference error
ブラウザではトップレベルで宣言したvar変数がwindowオブジェクトのプロパティになる
code:js
var x = 1;
console.log(window.x); // 1
仕様書のどこで規定されているのかは不明
今回の範囲
Global Environment Records (必要に応じて Object Environment Records へもどる) から
Object Environment Recordはwith文のための仕様なので優先度下げた
が、Global Environment RecordはObject Environment Recordに依存していることが判明した
common realm が global environment records を持っている
Global Environment Record
以下の2つのレコードの複合体として定義される
Object Environment Record
Declarative Environment Record
さらにAdditional FieldsとAdditional Methodsを持つ
with (obj) { ... }の中で行われた宣言はobjに影響を与えるのか?
→影響を与えない
code:declarations_in_with.js
const obj = {};
with (obj) {
a = 1;
var b = 2;
function f() {}
obj.d = 3;
console.log(obj);
console.log(d);
}
CreateGlobalVarBinding
The corresponding global object property will have attribute values appropriate for a var.
ここの解釈が問題になった
but it allows var declarations to receive special treatment.
yebis0942.icon「ただし、var declarationに特別な扱いをすることが許される」という意味で、以下のabs opで定義しているような[[VarNames]]の追跡などの追加的な操作があることを言っているのかも
HasBinding ( N )
! DclRec.HasBinding(N)
!とは→一般にHasBindingはabrupt completionを返すが、ここでは返さないということを示していそう
! “Never return an abrupt completion” Shorthands だった
? は ReturnIfAbrupt Shorthands
code:js
console.log(a); // undefined
}
with 文で特定のオブジェクトのプロパティをアクセスできなくできる
なんのための機能?
ビルトインオブジェクトに新しいプロパティを追加するときに互換性を維持するための機能
code:js
var keys = "my keys";
with (Array.prototype) { console.log(keys) }
// ES2015以前は"my keys"だが、ES2015からArray.prototype.keysが入ったので、挙動が変わってしまう
// →Array.prototype@unscopableに新設するプロパティを指定することで互換性を維持することにした CreateMutableBinding vs CreateImmutableBinding
A binding for N must not already exist in the DeclarativeRecord.
A binding must not already exist in this Environment Record for N.
説明がやや違うが、アルゴリズムではどちらもDeclarativeRecordしか確認していない
謎
InitializeBinding
未初期化の束縛を初期化する
Global Environment Recordが内部的に持つDeclarativeRecord / ObjectRecordの両方の束縛を初期化出来る
SetMutableBinding
ある名前に束縛されるMutableBindingの値を変更する
DeclarativeRecord側に無ければ、ObjectRecord側にSetMutableBindingしに行こうとする
strict modeだった場合、ObjectRecordへのSetMutableBindingはthrowするので、下記のような振る舞いになる
code:js
"use strict";
a = 1;
console.log(globalThis.a);
$ node xxx.js
a = 1;
^
ReferenceError: a is not defined
GetBindingValue
ある名前に束縛される値を取得する
code:js
let a = 1;
globalThis.a = 2;
console.log(a); // 1
DeleteBinding
bindingを削除できる(ただし明示的に削除できるとされたものに限り)
Remove N from envRec.[[VarNames]].
処理の詳細があまり指定されてない感
そもそも[[VarNames]]の要素がユニークだとも保証されていない
HasVarDeclaration
yebis0942.iconどこで使われているのか
GlobalDeclarationInstantiationが唯一の使用箇所っぽい