142

Mozilla Developer Networkの JavaScript リファレンスを調べていたところ、"strict mode". 私はそれを読み直しましたが、それが何をするのか理解するのに苦労しています。誰かが(一般的に)その目的とそれがどのように役立つかを簡単に説明できますか?

4

9 に答える 9

156

その主な目的は、より多くのチェックを行うことです。

"use strict";何よりも前に、コードの先頭に追加するだけです。

たとえば、blah = 33;有効な JavaScript です。これは、完全にグローバルな変数を作成することを意味しますblah

ただし、厳密モードでは、キーワード「var」を使用して変数を宣言していないため、エラーになります。

ほとんどの場合、任意のスコープの途中でグローバル変数を作成するつもりはないため、ほとんどの場合、blah = 33それはエラーであり、プログラマーは実際にそれをグローバル変数にしたくありませんでした。書くvar blah = 33

同様に、技術的に有効な多くのことを禁止します。NaN = "lol"エラーは発生しません。NaN の値も変更しません。厳密な this (および同様の奇妙なステートメント) を使用すると、エラーが発生します。を書く理由がないので、ほとんどの人はこれを高く評価していNaN = "lol"ます。

Strict モードの MDN ページで詳細をお読みください

于 2011-12-28T03:10:58.097 に答える
35

Simonの回答でまだ言及されていないstrictモードの1つの側面は、strictモードが関数呼び出しを通じて呼び出される関数に 設定thisされることです。undefined

だからこのようなもの

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

が呼び出されると、グローバルオブジェクトにプロパティを無用に追加するのではなく、privateMethod(にプロパティを追加できないため)エラーが発生します。undefinedb

于 2011-12-28T03:34:20.003 に答える
23

Strict モードが追加されたため、言語の将来のバージョンの適切なターゲットとなるECMAScriptの簡単に静的に分析可能なサブセットが存在するようになりました。厳密モードは、自分自身を厳密モードに制限する開発者が間違いを減らし、彼らが犯したバグがより明白な方法で現れることを期待して設計されました.

ECMAScript の次のメジャー バージョンになることが期待されるHarmonyは、ES5 strict の上に構築される予定です。

Harmony は、モードが多すぎるのを避けるために、ES5 の厳密モードに基づいて構築されています。

他のいくつかの言語実験も厳密モードに依存しています。SESは、ES5 の厳密モードの分析可能性に依存します。

SES (セキュア ECMAScript) 設計実験

ES5/Strict の機能を削除または修復して、オブジェクト機能プログラミング言語を設計します。

SES から ES5/Strict への簡単な変換があるはずです。

標準のAnnex Cでは、厳密モードと通常モードの違いについて説明しています。

strict モードの制限と例外

  • 識別子「implements」、「interface」、「let」、「package」、「private」、「protected」、「public」、「static」、および「yield」は、厳密モード コード内の FutureReservedWord トークンとして分類されます。(7.6.12 [?])。
  • 準拠する実装は、厳密モード コードを処理する場合、NumericLiteral (7.8.3) の構文を拡張して、B.1.1 で説明されている OctalIntegerLiteral を含めることはできません。
  • 準拠する実装は、厳密モード コード (10.1.1 を参照) を処理する場合、B.1.2 で説明されているように、EscapeSequence の構文を拡張して OctalEscapeSequence を含めることはできません。
  • 宣言されていない識別子または解決できない参照への代入は、グローバル オブジェクトにプロパティを作成しません。厳格モードのコード内で単純な代入が発生した場合、その LeftHandSide が解決できない Reference に評価されてはなりません。その場合、ReferenceError 例外がスローされます (8.7.2)。LeftHandSide は、属性値 {[[Writable]]:false} を持つデータ プロパティへの参照、属性値 {[[Set]]:undefined} を持つアクセサ プロパティへの参照、または存在しないプロパティへの参照でもありません。 [[Extensible]] 内部プロパティの値が false であるオブジェクトのプロパティ。これらの場合、TypeError 例外がスローされます (11.13.1)。
  • 識別子 eval または引数は、Assignment 演算子 (11.13) または PostfixExpression (11.3) の LeftHandSideExpression として、または Prefix Increment (11.4.4) または Prefix Decrement (11.4.5) 演算子によって操作される UnaryExpression として表示されない場合があります。 . 厳密モード関数の Arguments オブジェクトは、アクセス時に TypeError 例外をスローする "caller" および "callee" という名前の構成不可能なアクセサー プロパティを定義します (10.6)。
  • 厳密モード関数の Arguments オブジェクトは、配列のインデックス付きプロパティ値を、関数の対応する仮パラメーター バインドと動的に共有しません。(10.6)。厳密モード関数の場合、arguments オブジェクトが作成された場合、arguments オブジェクトへのローカル識別子引数のバインディングは不変であるため、代入式のターゲットにならない場合があります。(10.5)。
  • 厳密モードのコードに、任意のデータ プロパティ (11.1.5) の複数の定義を持つ ObjectLiteral が含まれている場合は、SyntaxError になります。識別子「eval」または識別子「arguments」が厳密なコードに含まれる PropertyAssignment の PropertySetParameterList の識別子として発生する場合、またはその FunctionBody が厳密なコード (11.1.5) である場合は、SyntaxError です。
  • Strict モードの eval コードは、eval の呼び出し元の変数環境で変数または関数をインスタンス化できません。代わりに、新しい変数環境が作成され、その環境が eval コード (10.4.2) の宣言バインディングのインスタンス化に使用されます。
  • this が厳密モード コード内で評価される場合、この値はオブジェクトに強制されません。null または未定義の this 値はグローバル オブジェクトに変換されず、プリミティブ値はラッパー オブジェクトに変換されません。関数呼び出し (Function.prototype.apply および Function.prototype.call を使用して行われた呼び出しを含む) を介して渡された this 値は、渡された this 値をオブジェクトに強制しません (10.4.3、11.1.1、15.3.4.3、15.3. 4.4)。
  • 厳密モード コード内で削除演算子が発生すると、その UnaryExpression が変数、関数引数、または関数名への直接参照である場合、SyntaxError がスローされます (11.4.1)。
  • 厳密モードのコード内で削除演算子が発生すると、削除されるプロパティに属性 { [[Configurable]]:false } (11.4.1) がある場合、TypeError がスローされます。VariableDeclaration または VariableDeclarationNoIn が厳密なコード内で発生し、その識別子が eval または arguments (12.2.1) である場合、これは SyntaxError です。
  • Strict モードのコードには、WithStatement を含めることはできません。このようなコンテキストで WithStatement が発生すると、SyntaxError (12.10) になります。
  • Catch を含む TryStatement が厳密なコード内で発生し、Catch プロダクションの識別子が eval または引数である場合、SyntaxError です (12.14.1)
  • 識別子 eval または引数が厳密モードの FunctionDeclaration または FunctionExpression (13.1) の FormalParameterList 内にある場合は、SyntaxError です。
  • 厳密モード関数には、同じ名前を持つ 2 つ以上の仮パラメーターを含めることはできません。FunctionDeclaration、FunctionExpression、または Function コンストラクターを使用してそのような関数を作成しようとすると、SyntaxError (13.1、15.3.2) になります。
  • 実装は、この仕様で定義されているものを超えて、呼び出し元という名前のプロパティまたは関数インスタンスの引数の厳密モード関数内の意味を拡張することはできません。ECMAScript コードは、厳密モード関数 (10.6、13.2、15.3.4.5.3) に対応する関数オブジェクトでこれらの名前のプロパティを作成または変更することはできません。
  • 厳密モード コード内で識別子 eval または引数を FunctionDeclaration または FunctionExpression の識別子として、または正式なパラメータ名 (13.1) として使用すると、SyntaxError になります。Function コンストラクター (15.3.2) を使用してこのような厳密モード関数を動的に定義しようとすると、SyntaxError 例外がスローされます。
于 2011-12-28T03:23:32.350 に答える
7

ECMAScript 5 では、strict モードの概念が導入されました。

コードで厳密モードを呼び出す

厳密モードは、スクリプト全体または個々の関数に適用されます。{} 括弧で囲まれたブロック ステートメントには適用されません。そのようなコンテキストに適用しようとしても何も起こりません。

スクリプト全体:

app.js を作成しているとしましょう。最初のステートメント use script を追加すると、コード全体に厳密モードが適用されます。

// app.js whole script in strict mode syntax
“use strict”;
// Now you can start writing your code

関数の厳密モード:

関数に対して厳密モードを呼び出すには、正確なステートメント「use strict」を入力します。他のステートメントの前の関数本体の先頭。

function yourFunc(){
    "use strict";

    // Your function code logic
}

Strict モードには、通常の JavaScript セマンティクスに対するいくつかの変更が組み込まれています。まず、厳密モードでは、エラーをスローするように変更することで、一部の JavaScript サイレント エラーを排除します。

例: Strict モードを使用するコード

ここに画像の説明を入力してください

上記のコード例では、コードで厳密モードを使用しないと、エラーはスローされません。x宣言せずに変数にアクセスしているため。したがって、厳密モードで宣言されていない変数にアクセスすると、エラーがスローされます。

ここで、厳密モードなしで宣言せずに、変数 x にアクセスしてみましょう。

(function(){
    x = 3;
})();

// Will not throw an error

厳密モードを使用する利点:

  • エラーをスローして、JavaScript のサイレント エラーを排除します。
  • JavaScript エンジンが最適化を実行するのを困難にする間違いを修正します。
  • コードを厳密モードではない同一のコードよりも高速に実行することがある
  • ECMAScript の将来のバージョンで定義される可能性があるいくつかの構文を禁止します。
于 2016-01-01T06:06:33.997 に答える
6

Strict モードは、通常の JavaScript セマンティクスにいくつかの変更を加えます。

  • strict モードは、エラーをスローするように変更することで、一部の JavaScript サイレント エラーを排除します。

  • 厳密モードは、JavaScript エンジンが最適化を実行するのを困難にする間違いを修正します。

  • 厳密モードは、ECMAScript の将来のバージョンで定義される可能性が高いいくつかの構文を禁止します。

于 2014-03-27T12:14:20.193 に答える
2

ECMAScript5では、いくつかの新しいオブジェクトとプロパティ、およびいわゆる"strict mode".

Strict モードは、非推奨の機能を除外する言語のサブセットです。ストリクト モードはオプトインであり、必須ではありません。つまり、コードをストリクト モードで実行したい場合は、(関数ごとに 1 回、またはプログラム全体に対して 1 回) 次の文字列を使用して意図を宣言します。

"use strict";
于 2015-08-15T11:31:06.390 に答える