Twitter hashtag: #esspec
便利ツール
時事ネタ
自己紹介 (近況報告)
syumai syumai.icon
Go / TSを書いて暮らしてます
体調がちょっとマシになってきました
TS Kaigi CfP出しそびれた…
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
花粉がピンチ
病院でより強い薬もらったら大丈夫になった
3月のわりに寒い
iwatsurut
とくに、イベントもなく過ごしています。
やっとすこし、SELinux がわかった気になれました。
前回のあらすじ
object initializer の PropertyDefinitionEvaluation あたりまで
今回の範囲
13.2.5.5 Runtime Semantics: PropertyDefinitionEvaluation の PropertyDefinition : MethodDefinition
MethodDefinitionEvaluation
10.2.8 DefineMethodProperty ( homeObject, key, closure, enumerable )
code:js
class C {
static prototype() {}
};
/*
static prototype() {}
^^^^^^^^^
SyntaxError: Classes may not have a static property named 'prototype'
*/
class C {
prototype() {}
};
// staticじゃなければOK
Objectのmethodでsuperを使った時の挙動
code:js
const o = {
m() {
return super.m() + 1;
}
}
console.log(o.m());
/*
/Users/syumai/go/src/github.com/syumai/til/js/esspec53/b.js:16
return super.m() + 1;
^
TypeError: (intermediate value).m is not a function
*/
const o = {
m() {
console.log(super); // 直接使うとSyntaxError
}
}
object も class も同じ MethodDefinitionEvaluation は同じロジックを使いまわしている
Function Declaration
code:js
function() {
console.log(1);
}
/*
function() {
^^^^^^^^
SyntaxError: Function statements require a function name
*/
Early Errors
code:js
const f = function(a, a) {
console.log(a); // 2
}
f(1, 2);
// strict modeではSyntax Error
const f1 = function eval() {
console.log(eval("1")); // 自身を取得できている
};
const f2 = function arguments() {
console.log(arguments); // Arguments { '0': 2 } };
const f3 = function func() {
console.log(func); // 自身を取得できている
};
f1(1);
f2(2);
f3(3);
console.log(f1.name, f2.name, f3.name);
// const / let / classの名前は、パラメータ名と重複できない
const f = function(a, b, c, d) {
// const a = 1;
// let b = 2;
// class c {}
function d() {}
}
f();
code:js
class A {
constructor(a) {
this.p = a;
}
}
class B extends A {
constructor(a) {
const f = function () {
if (a === 1) {
super("one");
return;
}
super("else");
};
f();
}
}
const b = new B(1);
console.log(b.p);
/*
super("one");
^^^^^
SyntaxError: 'super' keyword unexpected here
*/
// Arrow Functionだと何故かOK
class A {
constructor(a) {
this.p = a;
}
}
class B extends A {
constructor(a) {
const f = () => {
if (a === 1) {
super("one");
return;
}
super("else");
};
f();
}
}
const b = new B(1);
console.log(b.p); // "one"
chain production について復習
終端記号については無視できるパターンが多そう