So, I was reading the new Flow type strictness and noticed https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/ Specifically, I wondered whether the `sum_all` example would copy the arguments into an array, then loop over. Sadly, it does. ```js function sum_all(...rest) { let ret = 0; for (let i = 0; i < rest.length; i++) { ret += rest[i]; } return ret; } // output function sum_all() { var ret = 0; for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) { rest[_key] = arguments[_key]; } for (var i = 0; i < rest.length; i++) { ret += rest[i]; } return ret; } ``` But then I noticed if I changed `let i = 0` to `let i: number = 0`, it worked directly on `arguments`. That lead me down a rabbit hole to `Path#_guessExecutionStatusRelativeTo`. When tracing through, the last comparison made no sense to me. It was trying to find the index of `"init"` in a list of `["declarations"]` and `"body"` in `["directives", "body"]`. Red flags and such. But it makes sense when you're trying to compare the visitor order of the common ancestor path. Then we're trying to find `"init"` in a list of `["init", "test", "update", "body"]`. Oh, and there's `"body"` in there too! And now we know the `ForStatement`'s `init` is executed before the `body`.
27 lines
593 B
JavaScript
27 lines
593 B
JavaScript
var t = function () {
|
|
var x = arguments.length <= 0 ? undefined : arguments[0];
|
|
var y = arguments.length <= 1 ? undefined : arguments[1];
|
|
};
|
|
|
|
function t() {
|
|
var x = arguments.length <= 0 ? undefined : arguments[0];
|
|
var y = arguments.length <= 1 ? undefined : arguments[1];
|
|
}
|
|
|
|
function t() {
|
|
var a = [];
|
|
|
|
for (var i = 0; i < arguments.length; i++) {
|
|
a.push(i);
|
|
}
|
|
|
|
return a;
|
|
} // https://github.com/babel/babel/pull/2833#issuecomment-166039291
|
|
|
|
|
|
function t() {
|
|
for (var i = 0; i < arguments.length; i++) {
|
|
return arguments.length <= i ? undefined : arguments[i];
|
|
}
|
|
}
|