2014年9月28日日曜日

javascriptのhoistingは巻き上げってより吊し上げじゃね

小生は知らなかった、というか何となく回避しちゃってた、javascriptの「巻き上げ」という挙動があるらしい。※リンク先の記事を避難するものではありません。

http://analogic.jp/hoisting/

小生は、この記事を見ても「巻き上げ怖い」とは微塵も思いません。そもそも、ローカル変数宣言でグローバル変数を潰して使おうという発想がヤバイし、そんな実装するとは夢にも思いません。って言うかこのサンプルソースがまず気持ち悪い。「なんでわざわざそんなところでvar宣言?」サンプルだから、というのは百歩譲るとしても。

ですからjavascriptは気を効かせて「巻き上げて」置きますYO。或いはエンジンの実装でそうせざるを得なかったのかもしれません。「プロトタイプベース(オブジェクト指向)」は「クラスベース(オブジェクト指向)」とはまた違った実装の苦労があるでしょう。

そもそも「巻き上げ」?roll up?かと思ったら語源はhoistingらしい
http://ejje.weblio.jp/content/Hoisting

どうやら「引っ張り上げる」だけではなく「持ち上げた状態を維持する」というニュアンスもありそうだ。であれば「吊し上げ」の方が本来の意味には近いはず。語感は激しく悪いですけどね。まるで悪いことをしたかのようです。

悪いこと?

  1. 関数中盤でvar宣言、
  2. しかも関数序盤で、同名のグローバル変数を参照しようとする

どう転んでも見やすいソースには成らんでしょう。前述のサンプルソースも、変数名の書き間違いにしか見えません。javascriptのhoistingを食らうようなプログラマはhoistingするべき。