読者です 読者をやめる 読者になる 読者になる

うならぼ

どうも。

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を端から端まで読めばわかるのだろうか。