JavaScript文法サポート厳格モード:「use stript」

4153 ワード

JavaScriptコードに「厳格モード」と表示されている場合、その中で実行されているコードはすべて厳格モードである必要があります.その1:構文検出時に文法問題が発見されると、コードブロック全体が無効になり、文法異常を引き起こす.その2:運行期間に厳格なモードに違反するコードがあれば、実行異常をスローします.
注:テストしたIE 6,7,8,9は、厳格なモードをサポートしていません.
JavaScriptコード「厳格モード」の使用方法:厳格なモードは文字列のシーケンスを使用する必要があります.
 
"use strict"
 
下記の位置に参加すると、該当コードブロックの厳密なモードが開きます.1.グローバルコードの開始に参加しなければなりません.2.evalコードの開始箇所に加入する.3.関数宣言コードの開始に追加します.4.new Function()に入力されたbodyパラメータブロックに参加を開始します.
例1:
 
var num =012;alert(num);
 
非厳密モードでは、0(ゼロ)先頭プレフィックス宣言8進数が使用されてもよい.10を表示します
ただし、厳しいモードでは、エラーが発生します.
 
「use strict」
var num=012
alert(num)
 
テスト結果:IE 6,7,8,9はいずれも10を表示します.FFのエラー:octal literals and octal escape sequences are deprecated Chromeエラー:Uncagt Syntax Errror:Octal literals ares are not allowed.Operaエラー:Syntx erroar line 3 whiloading:Inchanger
厳密なモードを使用すると、0(ゼロ)の先頭プレフィックス8進数以外にも、1.コードには拡張された保留文字が使えません.implements、interface、let、package、prvate、public、static、yield 2.with文も使えません.3.evalとargmentsの2つの識別子を宣言または書き換えることはできません.4.deleteで明示的な宣言の識別子、名前、または具名関数を削除することはできません.
 
ソース:http://qianduan-notes.diandian.com/post/2012-06-02/40027620460
 
厳格モード
新しい仕様の一つの面白い部分は厳密なモードの導入である.厳密なモードは、JavaScript言語を開発者が使用できるようにするためのライセンス(opt-in)機構であり、限られたが、よりクリーンなサブセットである.Dugg Crockfordの精神によると、厳密なパターンは言語の一部の悪い部分を修復または制限することを目的としている.
厳密なモードはスクリプトまたは関数レベルで実装できます.これはいいです.モジュールとライブラリの作者が厳正なコードを作成することを選択できます.環境の残りの部分に影響を与えません.一つ覚えておきたいのは、性能要因の接続が厳密でないとシナリオが思わぬ結果をもたらすかもしれないからです.
スクリプトレベルで厳格なモードをアクティブにするには、文use strictは、ファイル内の他のすべての語句の前に含めることができる.リスト1は一例を示している.
リスト1.スクリプトレベルで厳格なモードをアクティブにする
				

"use strict";

var myNamespace = {

    myMethod : function(){

    	//strict code

	}

}

 
厳密モードを関数レベルでアクティブにする方法は、リスト2に示されるように、関数本体の他の任意のステートメントの前にステートメントuse strictを含むものと同様である.
リスト2.関数レベルで厳格なモードをアクティブにする
				

function getStrict(){

	"use strict";

	//strict code

}

 
ちょっと面白いです.厳密なモードをアクティブにするための文法は文字列表現の語句だけです.これはあなたのコードにその語句が含まれていること自体が悪い点ではないことを意味します.そのブラウザを理解するとサブセットが開きます.理解していないブラウザは、表現文として認識し、無視して次の行のコードを処理します.もちろん、いくつかのブラウザだけが厳しいモードをサポートしている場合、厳格なモードをアクティブにすると他の問題を引き起こす可能性がありますが、Use Strictコマンド自体はその中の一つではありません.
厳格モードの実戦
以下のいくつかの小さなセクションは、あなたのコード上の厳格なパターンの効果を簡単に示します.これは厳密なモードの各態様についての全面的な検討ではないが、これらの例はこの新しいモードの主な特徴を示している.厳格なモードを理解するための最良の方法は、厳格なモードをサポートするブラウザでこれらの例を試用することである.
もし大胆であれば、このコマンドを既存のスクリプトのトップに置いて、どれぐらいのエラーが発生するかを確認してください.
煩雑なエラーと意外なグローバル変数の死
厳格なモードの中で特に好きな部分はコード審査の中の難癖部分のように見えます.厳密なモードは、標準スクリプトでは通常無視されるか、サイレント失敗するいくつかの一般的な負の符号化モードを実際のエラーに変換します.最も一般的なパターンは、varステートメントを使用していない未宣言変数に値を割り当て、大域変数を意外に作成することである.標準コードの中で、これはただ一つの不良な実践です.厳密なモードでは、リスト3に示されているように、参照エラーが投げられます.
リスト3.予期しないグローバル変数を禁止する
				

function nopullution(){

	"use strict";

	myAccidentalGlobal = "polluting the global namespace is for losers";

}

nopullution();

>>>Error: assignment to undeclared variable myAccidentalGlobal

 
場合によっては、予期せぬグローバル変数は、thisキーのバインディング方式を変更することによって防ぐことができる.例えば、新しいプレフィックスを使用する代わりに、ビルダー関数が直接呼び出されると、thisはグローバルオブジェクトにバインドされる.この場合、厳密モードはthisundefinedに結びつけ、大域名空間の予期せぬ破壊を防ぐ.
また、元の動作は沈黙されていましたが、削除できない属性や重複パラメータや属性名などを削除するなど、エラーが発生しました.リスト4はいくつかの例を示している.
リスト4.煩雑なエラー
				

"use strict"

delete Array.prototype;



>>>Error: property "use strict";Array.prototype is non-configurable and

can't be deleted

"use strict"

var myObj ={

        dupe: 1,

        dupe :2

}

>>>Error: property name dupe appears more than once in object literal

 ソース:http://www.ibm.com/developerworks/cn/web/wa-ecma262/index.html