Twitter hashtag: #esspec
便利ツール
時事ネタ
次回はGW終了直後ですね
-> 普通にGW終了直後にやります
自己紹介 (近況報告)
syumai syumai.icon
Go / TSを書いて暮らしてます
また別チャンネルでライブしました
Findyさんのイベントで話しました
色々詰め込み過ぎた感があるのでしばらく休暇したい
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
首を痛めた
syumai.icon Evernoteネタ
iwatsurut
とくに、イベントもなく過ごしています。
本の数式を写経するだけなら、VSCode の html preview が便利そう
yebis0942 (えびす) yebis0942.icon
GoとReact
最近はScrapboxのuserscriptを書くのが楽しい
書いたことで満足してあんまり使わないというカスタマイズ沼
突然の数式
$ i\hbar\frac{\partial}{\partial t}\psi(x,t)=\left(-\frac{\hbar^2}{2m}+V(x)\right)\psi(x,t)
tomato3713 (とまと/ねことまと)tomato3713.icon
Go と Perl
社内でGoのProposal読む会をしたり、OOC2024 staff やったり
前回のあらすじ
1から読んでみる
10. VarScopedDeclarations
難解。あとで要確認
今回の範囲
step16
If func.[[ThisMode]] is lexical, then
a. NOTE: Arrow functions never have an arguments object.
b. Set argumentsObjectNeeded to false.
arguments オブジェクトが作られるかどうかの制御っぽい
arrow functionとarrowじゃないfunctionでargumentsの振る舞いを見てみる
code:js
const f = function () {
console.log(arguments);
};
const arrowF = () => {
console.log(arguments);
};
f(1, 2, 3); // 期待通りのargumentsが出る
arrowF(1, 2, 3); // Node.jsの実行コンテキストのargumentsが出てそう
/*
'0': {},
main: {
id: '.',
path: '/Users/syumai/go/src/github.com/syumai/til/js/esspec56',
exports: {},
filename: '/Users/syumai/go/src/github.com/syumai/til/js/esspec56/step16.js',
loaded: false,
children: [],
},
*/
step17
code:js
const f = function (arguments) {
console.log(arguments);
};
const arrowF = (arguments) => {
console.log(arguments);
};
f(1, 2, 3);
arrowF(1, 2, 3);
/*
1
1
*/
step18
code:js
// hasParameterExpressions: true
function f1(a = 1) {}
f1();
// hasParameterExpressions: true
function f2({ [a]: myA }) {
console.log(myA);
}
f2({ a: 1, b: 2 });
/*
18. Else if hasParameterExpressions is false, then
a. If functionNames contains "arguments" or lexicalNames contains "arguments", then
i. Set argumentsObjectNeeded to false.
*/
// hasParameterExpressions: false
function f3() {}
// hasParameterExpressions: false
function f4(a, b) {}
// hasParameterExpressions: false
function f5({ a }) {}
// hasParameterExpressions: false, argumentsObjectNeeded: false
function f6() {
console.log(arguments);
function arguments() {} // functionNames
}
f6();
// hasParameterExpressions: false, argumentsObjectNeeded: false
function f7() {
let arguments = 0; // lexicalNames
console.log(arguments);
}
f7();
// おまけ
function f1() {
var arguments = 1;
console.log(arguments);
}
function f2() {
console.log(arguments);
var arguments = 1;
}
f1(100); // 1
step20
code:js
// 19. If strict is true or hasParameterExpressions is false, the
// 20. Else,
// a. NOTE: A separate Environment Record is needed to ensure that bindings created by direct eval calls in the formal parameter list are outside the environment where parameters are declared.
//
var b = 2;
function f(a = eval("var b = 1"), x = b, y = eval("b = 3")) {
console.log("inside", b, x, y); // 3, 1, 3
}
f();
// console.log("outside", b); // Reference Error
code:js
// 19. If strict is true or hasParameterExpressions is false, the
// 20. Else,
// a. NOTE: A separate Environment Record is needed to ensure that bindings created by direct eval calls in the formal parameter list are outside the environment where parameters are declared.
//
// indirect eval
const _eval = eval;
function f(a = _eval("var b = 1"), x = b, y = _eval("b = 3")) {
console.log("inside", b, x, y); // 3, 1, 3
}
f();
console.log("outside", b); // 3
// step 20のenvironment record差し替えの擬似コード
const outerEnv = {};
const calleeContext = {
VariableEnvironment: outerEnv,
LexicalEnvironment: outerEnv,
};
const env = new DeclarativeEnvironment(outerEnv);
calleeContext.LexicalEnvironment = env;
step21
NOTE: Early errors ensure that duplicate parameter names can only occur in non-strict functions that do not have parameter default values or rest parameters.
code:duplicate parameter namesがSyntaxErrorになる場合とならない場合.js
// OK
function f1(a, a) {
console.log(a);
}
f1(1, 2); // 2
// SyntaxError: Duplicate parameter name not allowed in this context
function f2(a, a, b = 1) {
console.log(a);
}
// SyntaxError: Duplicate parameter name not allowed in this context
function f3(a, a, ...args) {
console.log(a);
}
/*
21. For each String paramName of parameterNames, do
a. Let alreadyDeclared be ! env.HasBinding(paramName).
b. NOTE: Early errors ensure that duplicate parameter names can only occur in non-strict functions that do not have parameter default values or rest parameters.
c. If alreadyDeclared is false, then
i. Perform ! env.CreateMutableBinding(paramName, false).
ii. If hasDuplicates is true, then
1. Perform ! env.InitializeBinding(paramName, undefined).
*/
function f(a, a, b, c) {}
code:_
Let alreadyDeclared be ! env.HasBinding(paramName).
! は例外をスローするかもしれないが、このパスではスローしないことを示す
なのでここでは例外を出さないけど、env.HasBinding()は例外を出す関数
step 22
CreateUnmappedArgumentsObject とは?
[[ParameterMap]] の使い道
CreateMappedArgumentsObject
arguments.calleeを作っている
code:arguments.calleeの例.js
(function () {
console.log(i);
if (i > 10) {
return;
} else {
arguments.callee(i + 1);
}
})(1);
/*
1
2
3
4
5
6
7
8
9
10
11
*/
code:argumentsが再代入できる場合、できない場合.js
/*
22. If argumentsObjectNeeded is true, then
a. If strict is true or simpleParameterList is false, then
i. Let ao be CreateUnmappedArgumentsObject(argumentsList).
b. Else,
i. NOTE: A mapped argument object is only provided for non-strict functions that don't have a rest parameter, any parameter default value initializers, or any destructured parameters.
ii. Let ao be CreateMappedArgumentsObject(func, formals, argumentsList, env).
c. If strict is true, then
i. Perform ! env.CreateImmutableBinding("arguments", false).
ii. NOTE: In strict mode code early errors prevent attempting to assign to this binding, so its mutability is not observable.
d. Else,
i. Perform ! env.CreateMutableBinding("arguments", false).
e. Perform ! env.InitializeBinding("arguments", ao).
f. Let parameterBindings be the list-concatenation of parameterNames and « "arguments" ».
*/
// strict: true
function f1() {
"use strict";
// console.log(arguments.callee); // TypeError
// arguments = {}; // SyntaxError
}
f1(1, 2, 3);
// simpleParameterList: false
function f2(x = 1) {
// console.log(arguments.callee); // TypeError
arguments = {}; // 再代入できる
}
f2(1, 2, 3);
// strict: false && simpleParameterList: true
function f3() {
console.log(arguments.callee); // f3
arguments = {}; // 再代入できる
}
f3(1, 2, 3);
« 1, 2, 3 »
「1, 2, 3の値を持つList」を意味する
このListはECMAScript Specification typesのList type