Jail 内の Prisoner が無事に外側のネットワークとおしゃべりできるようになってとても嬉しい KOBA789 です。VIMAGE でネットワークスタックも分離してるんですよ! 仮想ネットワークですよ! という話は明日書きます。今日は ES.next の const と、みんな大好き Node.js の話。
発端
ある日、メールボックスを開けるとなんかアレなトピックが投稿されていた。
以下、nodejs_jp の MLより投稿をいくつか引用。
shimaden こんにちは。 shimaden と申します。 Node.js のモジュールを書くときに strict モードは使えますでしょうか? 過去のMLをみたところ、ryan は「V8 で問題がなければ strict モードを必須にするかもしれない」 と言っているようですが。(英語に自信がないので間違っていたらごめんなさい) http://groups.google.com/group/nodejs/browse_thread/thread/d3c1d1f7931870ed
「ほう、strict モードとな。」
そういえば自分は、OAuth-Revenge で Object.freeze したオブジェクトが変更された際に例外をスローさせるため、strict モードを使ったことがありました。
というわけで返信。
カチャカチャ……ッターン
KOBA789 です。 使えますよ。自分が作ったモジュールの一部では、Object.freeze したオブジェクトを書き変えようとしたときに例外をスローさせるために有効にしています。 http://github.com/koba789/oauth-revenge/
ちゃっかりモジュールの宣伝もしました。
そして今日
Shin Suzuki こんにちは。 strict modeにするとconst宣言が使えなくなります。 constもstrict modeも保守性をあげるために有用だと思っているのですが、 両方同時には使えません。
お、const の話題が。そうそう、strict だと const 使えないよねー。Object.freeze は便利になるのになんかジレンマ。
するとそれに返信が。
Koichi Kobayashi 小林 (koichik) です. そもそも既存の const は ES5 の一部ではない、各処理系 (Node にとっては V8) の独自実装にすぎないわけですしおすし。 # 言い過ぎ? Netscape/Mozilla 原理主義 (いるのか?) の人、怒らないで
そうそう、const って元々独自実装で、IE なんかだと無いんだよねー。
↓続き↓
しかし!! 現在開発中の Node v0.7 系 (未リリースなので master から自分で ビルドする必要あり) が採用している V8 3.8 では、--harmony_scoping (または --harmony) オプションを指定することで、ES.next の const を 使用することができます。 例: function a() { 'use strict'; const y = 0; y = 1; } 普通に実行すると、strict モードで const を使ってると怒られます。 $ ./node /tmp/a.js /tmp/a.js:3 const y = 0; ^^^^^ node.js:216 throw e; // process.nextTick error, or 'error' event on first tick ^ SyntaxError: Use of const in strict mode. at Module._compile (module.js:429:25) at Object..js (module.js:452:10) at Module.load (module.js:353:31) at Function._load (module.js:310:12) at Array.0 (module.js:472:10) at EventEmitter._tickCallback (node.js:207:40) --harmony_scoping オプションを指定して実行すると、const な変数に 代入していると、「文法エラー」になります。 $ ./node --harmony_scoping /tmp/a.js /tmp/a.js:4 y = 1; node.js:216 throw e; // process.nextTick error, or 'error' event on first tick ^ SyntaxError: Assignment to constant variable. at Module._compile (module.js:429:25) at Object..js (module.js:452:10) at Module.load (module.js:353:31) at Function._load (module.js:310:12) at Array.0 (module.js:472:10) at EventEmitter._tickCallback (node.js:207:40) ~/git/joyent/node$ 実行時エラーではないことに注意。そもそも a() を呼び出していないので、 再代入は実行されていないのです。 詳しくは Const なんとか先生のこちらをどぞー。 http://d.hatena.ne.jp/Constellation/20111201/1322678350
マジっすか!!!
Node.js で ES.next が使えるんですか!
これは使ってみるしかない!!
準備
相変わらず前置きが長いですね。ようやく準備です。ソース取得からビルドまで一気に行きましょう!
$ git://github.com/joyent/node.git $ cd node $ ./configure $ make -j6 $ ln -fs out/Release/node node $ ./node -v v0.7.0-pre
うむ。