[javascript ECMAScript5] Q. Strict Mode

A.
ECMAScript5ではStrictモードが追加されました。
Strictモードではいくつかの機能が制限されたり、
より多くの例外が投げられるようになり、
プログラムのミスがより気づきやすくなりデバックの効率の改善が期待されます。

Strictモードを利用するには文字列リテラルで"use strict" とスクリプトの先頭に記述します。
(Strictモードに対応していないブラウザでもエラーが発生しないように
文字列リテラルで表記する事になっています。)
"use strict";

Firefox 4.0b10で Strictモードを試してみます。

宣言を行っていない変数への代入
"use strict";
a = 1;
js_strict_1.png



書き込み不可のプロパティへの代入
Object.defineProperty(obj, "a", { value : 1,
                                    writable : false,
                                    enumerable : true,
                                    configurable : true});
obj.a = 2;
js_strict_2.png



削除不可のプロパティを削除
var obj = { d:1 };
Object.defineProperty(obj, "b", { value : 1,
                                    writable : false,
                                    enumerable : true,
                                    configurable : false});

delete obj.b;
js_strict_3.png


拡張不可に設定されているオブジェクトを拡張
console.log( Object.isExtensible(obj) );
Object.preventExtensions(obj);
console.log( Object.isExtensible(obj) );
obj.c = 1;
js_strict_4.png


削除不可のプロパティを削除
console.log( Object.isSealed(obj) );
Object.seal(obj);
console.log( Object.isSealed(obj) );
delete obj.d
js_strict_5.png


arguments.calleeは使えない
function test(a){
  arguments.callee;
}
test(1);
js_strict_6.png


use strict中の関数のthisはundefinedになる
function test(){
  console.log( this );
}
test();
js_strict_7.png


オブジェクトリテラルで同じプロパティ名を使う
function test(a){
  arguments.callee;
}
test(1);
js_strict_8.png


8進数リテラルは例外発生
var oct = 011;
js_strict_9.png


undefinedに代入不可
undefined = 1;
js_strict_10.png


NaNには代入できない
NaN = 1;
js_strict_11.png


Infinityには代入できない
Infinity = 1
js_strict_12.png


参考サイト:
MDN Strict モード
ECMAScript 5 strict mode in Firefox 4