Twitter hashtag: #esspec
便利ツール
時事ネタ
自己紹介 (近況報告)
syumai syumai.icon
Go / TSを書いて暮らしてます
先月札幌でECMAScriptの仕様の読み方について話しました
先週末Web Developer Conference 2024でLT
Explicit Resource Management
今週末Asakusa.goと言うイベントをやります
iwatsurut
とくに、イベントもなく過ごしています。
スマホが文鎮になってショックです。
前回のあらすじ
今回の範囲
16 ECMAScript Language: Scripts and Modules の 16.1.7 GlobalDeclarationInstantiation の step: 9 から
step 10
ForBindingのBoundNamesの例
下記では a
code:js
const obj = {
a: 1,
b: 2,
};
for (var { a } = obj; a < 10; a++) {
console.log(a);
}
env.CanDeclareGlobalVar
Extensibleでない、かつプロパティが無い場合はTypeError
code:js
Object.isExtensible(globalThis)
true
Object.seal(globalThis)
Object.isExtensible(globalThis)
false
(0, eval)("var x = 1;") // CanDeclareGlobalVar: falseの環境
Uncaught TypeError: Cannot add property x, object is not extensible
at eval (eval at <anonymous> (REPL22:1:10), <anonymous>:1:1)
at eval (<anonymous>)
Extensibleでないが、プロパティが既にある場合はエラーなし
code:js
(0, eval)("var x = 1;")
undefined
x
1
Object.seal(globalThis)
(0, eval)("var x = 1;")
undefined
step 12: Annex B.3.2.2?
Annex Bに書かれているのは以下のケース
FunctionDeclaration Fと同じFで宣言をするVariableDeclarationがEarlyErrorを引き起こさなかった時
下記の例では、そこまでは見ていない
Block, Switchで宣言された関数の利用
code:js
(0, eval)(`
{
function f1() {
console.log(1);
}
}
switch (true) {
case 1:
function f2() {
console.log(2);
}
default:
function f3() {
console.log(3);
}
}
`);
console.log(f1, f2, f3);
f1();
// f2();
f3();
strict modeにすると、f1 ~ f3 全てReferenceErrorになる
step 15
const 以外の宣言はMutable (関数宣言など(Hoistable)も含む)
code:js
const a = 1;
let b = 2;
b = 3;
function f() {}
f = 4;
console.log(a, b, f); // 1, 3, 4
step 16
configurableなglobalObjectのプロパティは、グローバルな関数宣言によって上書きされることができる
上書き時に、enumerable: true, writable: trueになる
code:js
(0, eval)(`
Object.defineProperty(globalThis, 'x', {
value: 42, writable: false, enumerable: false, configurable: true,
});
`);
console.log("x is enumerable:", Object.keys(globalThis).includes("x"));
console.log(x);
try {
x = 3;
} catch (e) {
console.error(e);
}
console.log(x);
(0, eval)(`
function x() {
console.log("x!");
}
`);
console.log("x is enumerable:", Object.keys(globalThis).includes("x"));
x();
x = 3;
console.log(x); // 3