ECMAScript 3.1のStrictモード
2110 ワード
もっと読む
MozillaのJavaScriptエンジンSpidear MonkeyとRhinoは早くからStrictモードを導入していますが、現在はES 3.1仕様草案がStrictモードを標準化しています.
プログラムの先頭または関数の先頭にStrictコマンドを使用するとStrictモードが有効になります.
無駄話は言わないでください.カワセミ、コードを付けます.
変数以外はすべて声明が必要です.
1.blockの中でvar定義が現れることができなくて、if、for、while、switchなどの構造の中ですべてvar定義があることができません!
2.eval中のvar/function声明は局在化されている(Functionコンストラクタのような):
4.with文は含んではいけません.
5.calerとargments.calee属性は使えません.
6.一般的な関数呼び出しでは、globalオブジェクトではなく、nullです.
その他の重要でない変更は、読み取り専用属性、拡張不可オブジェクトに対して、値付け、+++および--操作などが使用される場合、削除不可属性の操作に使用される場合、TypeErrが投入される可能性があります.賦、delete操作はまたReferenceErrを投げるかもしれません.関数には同じ名前のパラメータがありません.アーグメンント[n]を変更すると、対応する名前パラメータに影響を与えません.逆も同じです.
注:以上はES 3.1 2008年12月の草案によると.
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月の草案によると.