開眼!JavaScript

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質


オライリー本に珍しく、薄く(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を作った人なんでしょ?なんか時代は巡る。私も開発者リハビリ進めてます。