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使ってないのは何か理由があるんだろうか。