開眼!JavaScript
開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質
- 作者: Cody Lindley,和田祐一郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/06/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
オライリー本に珍しく、薄く(171ページ)小さな版の本です。Ninja本の濃さはないながらJavaScriptの仕様を総ざらいしてくれる本で今の私にはとても面白い。はじめのちょろい内容の数章はとりあえず読み飛ばして、thisの章読んでたらちょうど不思議に思ってた謎が一つとけました。
Node.jsのコアライブラリのソースを読んでると、よく「var self = this;」と一旦ローカルスコープの変数に受け直してる記述があったので、なんでかなと思っていました。これは関数の中で定義された入れ子の関数でthisを参照すると意に反してグローバルオブジェクトになっちゃうという(!)言うならばECMAScript3のバグちっくな仕様の回避コードだという。。。へー。勉強になった。Ninjaの本には書いてあったのかな?さらっと見返したけど見当たらない。さて、読み飛ばす心を入れ替えて、この本小さく薄いからしばらく鞄に入れておいて、頭からきちんと読んでみます。
function ThisTest () { this.firstLevel = function() { var self = this; console.log('first: ' + this); // 一層目のthis secondLevel(); function secondLevel() { console.log('second: ' + this); // 二層目のthis console.log('self: ' + self); // 関数ローカルにthisを受け直したもの } }; } var test = new ThisTest(); test.firstLevel();
これ、Node.js v0.10.18で実行すると確かに結果は以下。おそろしや、おそろしや。
first: [object Object] second: [object global] self: [object Object]
この入れ子関数でthisが吹っ飛んじゃうのはECMAScript5では変更になるって本には書いてあった。早く5になったほうがいいね。そして実はJavaScriptをやりながらTypeScriptが気になる。ECMAScript6の仕様の一部を先取りでとりいれつつ現行JavaScriptのコードにコンパイルするというTypeScript。ちゃんと動くなら素敵。静的型付けもジェネリックもあるみたいだし。V8はオンザフライとはいえOSネイティブにコンパイルするというから、型あり爆速で、もうなんというか...そそる。
そしてTypeScriptを開発している、元ボーランドで現マイクロソフトの、アンダース=ヘジルスバーグは僕ら世代以上プログラマのアイドルだからw。V8はJava Hotspotを作った人なんでしょ?なんか時代は巡る。私も開発者リハビリ進めてます。