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
うむ。