JavaScript 第5版読んできた

昨日書き忘れたんだけど、JavaScript第5版読んできた、オライリーのあれ。3章?くらいまでをざっと見て、気になったのは二つ。ひとつめはスコープ、ふたつめは関数が定義される時点が実行前ってこと。

var scope = 'global';
function f() {
  alert(scope);  // undefined
  var scope = 'local';
  alert(scope);  // 'local'
}
f();
var scope = 'global';
function f() {
  alert(scope);  // 'global'
  scope = 'local';
  alert(scope);  // 'local'
}
f();

結果はコメントの通りなんだけど、一個めはundefinedで、二個めは'global'なんだよね。外側のスコープを利用するのはC的には普通なので、二個めはそれほど不自然でもない。ただ、一個めには違和感がある、宣言した時点で上書きされるわけじゃなく、変数を宣言したら関数内全体を上書きをするためこんな風になる、のかな?*1スコープが関数内全体なんだよね。C++もこうなんだっけ?C++まじめにやってないんでわからない。Cだとそもそもそんな自由に宣言できねーし。関数の先頭で宣言する←結論。

var f = 's';
function f() {
  /* ... */
}
alert(typeof f);  // string

fはfunctionの方で上書きされるのかと思いきや、違う。この関数はもう呼び出せない、のかな。f = function() { /* ... */ } てな風にすれば紛らわしくないかも。function f() {} と f = function();の違いはどれくらいあるんだろ。

もっとゆっくり読みたいなー、でも立ち読みだとあの本重いし腱鞘炎になりそうなんだよねー、かといってお金もないんだよねー、うまくいかないよねー

*1:よくわかってない、誰か説明よろ