ECMAScript 3.1のStrictモード


もっと読む
MozillaのJavaScriptエンジンSpidear MonkeyとRhinoは早くからStrictモードを導入していますが、現在はES 3.1仕様草案がStrictモードを標準化しています.
プログラムの先頭または関数の先頭にStrictコマンドを使用するとStrictモードが有効になります.
無駄話は言わないでください.カワセミ、コードを付けます.


//        strict  
use strict

function f() {
  // strict          strict 
  try {
    // strict      eval  strict 
    eval('x = 1') // strict         x       ,
                  //     global   x
  } catch (e) {
    new Function('x = 1')() // strict      new Function
                            //  non-strict !
  }
}

assert (window.x === undefined)
f()
assert (window.x === 1)




//      non-strict  

function f1()
  //     non-strict  
  //  eval  non-strict  
  eval('x = 1') 
}

function f2() {
  //       strict  
  use strict
  //  eval  strict  
  eval('x = 1')
}

f3 = new Function('use strict; x = 1') //   strict  

assert (window.x === undefined)
try { f2() } catch(e) {
try { f3() } catch(e) {
  f1()
}}
assert (window.x === 1)


(ES 3.1の完全な実現はまだないので、上記のコードは遠観しかできません.冒して遊んではいけません.)
変数以外はすべて声明が必要です.
1.blockの中でvar定義が現れることができなくて、if、for、while、switchなどの構造の中ですべてvar定義があることができません!
2.eval中のvar/function声明は局在化されている(Functionコンストラクタのような):

new function () {
  eval('var x=1; alert(x);')  // x is only accessible in the eval code
  alert(x);  // error
}
3.evalは直接に起動するだけで、任意の間接的な呼び出し(eval.cal)やevalを他の変数に付与しようとすると、EveralErrを投げます.
4.with文は含んではいけません.
5.calerとargments.calee属性は使えません.
6.一般的な関数呼び出しでは、globalオブジェクトではなく、nullです.
その他の重要でない変更は、読み取り専用属性、拡張不可オブジェクトに対して、値付け、+++および--操作などが使用される場合、削除不可属性の操作に使用される場合、TypeErrが投入される可能性があります.賦、delete操作はまたReferenceErrを投げるかもしれません.関数には同じ名前のパラメータがありません.アーグメンント[n]を変更すると、対応する名前パラメータに影響を与えません.逆も同じです.
注:以上はES 3.1 2008年12月の草案によると.