use strictの影響範囲
use strictは関数内に書けばその関数内だけで有効になるわけだけど、グローバルの領域に
'use strict';
...
とか書くと、人が書いた他のモジュールに影響出ちゃうんで
(function() { 'use strict'; ... })();
こうするのが礼儀かと思ってたけど、やってみたらそうでもなかった。
<script src="test1.js"></script> <script src="test2.js"></script>
// test1.js 'use strict';
// test2.js var o = { a: 1, a: 2 };
これエラーになるかと思ってたら、ならないのね(Chrome16、Firefox8)。
ちなみにこれがエラーになるのは確認済み。
// test1.js 'use strict'; var o = { a: 1, a: 2 }; //=> Uncaught SyntaxError: Duplicate data property in object literal not allowed in strict mode
関数スコープだけじゃなくてファイルスコープもあるってことなのかしら。仕様のどこかに書いてあるかな。仕様というかブラウザの実装依存かな。
ちなみにNode.jsだとモジュールごとのスコープになるのでこれがエラーにならないのはまあわかる。
require('./module.js'); var o = { a: 1, a: 2 };
// module.js 'use strict';
完全に余談だけどTJとかGuillermoとかNode.jsのハッカーたちがuse strict使ってないのは何か理由があるんだろうか。