この記事では、JavaScript に関する関連知識を紹介します。Strict モードは理解しやすいものであり、コードを Lazy モードから暗黙的に離脱させます。皆さんのお役に立てれば幸いです。
[関連する推奨事項: JavaScript ビデオ チュートリアル、Web フロントエンド]
ECMAScript5 標準では、JavaScript が厳密モードの概念を提案しました。
Strict モードは理解するのが簡単で、コードを暗黙的に「lazy モード」から抜け出す制限的な JavaScript モードです。
ストリクト モードをサポートするブラウザがコード内でストリクト モードを検出すると、より厳密な方法でコードを検出して実行します。
厳密モードでは、通常の JavaScript セマンティクスにいくつかの制限が課されます。
Strict モードでは、元のサイレント エラーの一部をスローすることで排除します。
Strict モードを使用すると、コードの実行時に JS エンジンがさらに最適化を実行できます (特別な構文を扱う必要はありません)。
厳密モードでは、ECMAScript の将来のバージョンで定義される可能性のある一部の構文が無効になります。
では、厳密モードを有効にするにはどうすればよいでしょうか?厳密モードは詳細な移行をサポートします。
js ファイルでの厳密モードのオンをサポートできます。
また、特定の機能に対して厳密モードをオンにすることもサポートされています。
JavaScript は初心者の開発者が使いやすいように設計されているため、構文が正しくない場合がありますが、正常に解析できるとは考えられません。
ただし、この方法ではセキュリティ上のリスクが残る可能性があります。
厳密モードでは、この種のトランザクションはエラーとして扱われるため、すぐに発見して修正できます。
以下に、一般的な制限の概要を示します。
グローバル変数を誤って作成してしまう方法は 2 つあります。
キーワードを使用せずにグローバル変数を直接グローバルに宣言します
関数内でキーワードを使用せずに変数を宣言すると、関数はデフォルトでグローバル変数に昇格されます。コード例は次のとおりです。
「厳密に使用する」 // グローバル変数の誤った作成を無効にする message = 'グローバル変数の誤った作成' console.log(message) //エラー メッセージは次のとおりです: Uncaught ReferenceError: メッセージが定義されていません 関数 foo () { 年齢=20歳 console.log(年齢) } foo() // ReferenceError: 年齢が定義されていません
サンプルコードは次のとおりです。
// strict モードを有効にして、問題を直接エラー「use strict」に変換します const v = 100;//(定数を定義) v = 1.14; //値を(変数に)再代入します。 console.log(v); // キャッチされない TypeError: 定数変数への代入。
厳密モードでは、変数に対して選択解除演算子を使用できません。
// strict モードをオンにする 'use strict' var v = 100; delete v;//非厳密モード: これはサイレント障害であり、エラーは報告されず、変数 v も削除されません。 console.log(v);//100 //厳密モードをオンにすると、代わりにエラーが報告されます。厳密モードでは修飾されていない識別子が削除されます。
厳密モードでは、配列およびメソッド属性に delete キーワードを使用しても同じ効果があります。
// strict モードをオンにする 'use strict' // 1. 厳密モードで配列の内容を削除します var arr = [1,2,3,4] arr[0] を削除します。 console.log(arr);//[ <1 個の空のアイテム>, 2, 3, 4 ] // 2. 厳密モードの削除関数の属性 var obj = { 名前:「ブタマン」 } obj.name を削除します。 console.log(obj.name)//未定義
サンプルコードは次のとおりです。
「厳密に使用する」 // 同じパラメータ名の関数は使用できません function foo2 (x, y, x) { console.log(x, y, x) } foo2(10, 20, 30) // SyntaxError: このコンテキストでは重複したパラメータ名は許可されません
サンプルコードは次のとおりです。
// 元の 8 進形式 var num1 = 0123 は許可されません var num2 = 0o123 // この形式では 8 進数として書き込むことができます var num3 = 0x123 // この形式では 16 進数として書き込むことができます var num4 = 0b100 // この形式ではバイナリとして書き込むことができます console.log(num1) // SyntaxError: 8 進リテラルは、厳密モードでは許可されません。 console.log(num2, num3, num4) // 83 291 4
サンプルコードは次のとおりです。
「厳密に使用する」 var message = 'Hello World'; var obj = { 名前: 'ジャム'、年齢: 20 } //with ステートメントは独自のスコープを形成できます。with ステートメントで age を出力する場合、obj オブジェクトの age 属性が出力されます。ただし、存在しない属性メッセージが with ステートメントで出力される場合は、それが出力されます。外側のスコープに 1 レベル、関数 foo () { を見つけるには 1 レベル。 with (obj) { console.log(年齢) console.log(メッセージ) } console.log(メッセージ) } foo() // SyntaxError: Strict モードのコードには with ステートメントが含まれていない可能性があります
サンプルコードは次のとおりです。
var jsString = "var message = 'hello world';console.log(message)" eval(jsString) // hello world を出力します console.log(message) //エラー メッセージは次のとおりです: ReferenceError: メッセージが定義されていません
开启严格模式eval函数不会向上引用变量所以全局作用域就没有message这个变量所以会报错
サンプルコードは次のとおりです。
「厳密に使用する」 // 厳密モードでは、自己実行関数 (デフォルト バインディング) は未定義を指し、非厳密モードではウィンドウを指します。 関数 foo () { console.log(これ) } foo() // 未定義