Named Function Expression が作るスコープ
ES6のclassがeslintのno-shadowルールに引っかかるという話を調べる過程で、eslintのスコープ解析に使われているescapeの動きを見ていたら面白いことに気づいた。ブラウザで動くデモが便利。
var hoge = function piyo(){};
これだけのコードでスコープが3つ認識されている。
変数hogeを持ったグローバルスコープ、piyoの関数スコープが一つ。この中間に、「piyoという変数を持ったスコープ」があることになっている。
関数名を伴ったfunction式、Named Function Expression は
- 外側のスコープからは関数名でアクセスできない
- 内側からは関数名でアクセスできる
という特徴を持つ。なるほど、だから親スコープ以外のどこかに関数への参照を保持しておく必要があると。
でもだったら、関数スコープの中に持てばいいのでは?というと、ECMA262 5th でそう規定されているらしい。読んだけど、なぜ内側のスコープに持たせないのかの謎は解けず。ECMA262を端から端まで読めばわかるのだろうか。