8124

最近、JavaScriptコードの一部をCrockfordのJSLintで実行したところ、次のエラーが発生しました。

1行目の文字1の問題:「usestrict」ステートメントがありません。

検索をしてみると"use strict";、JavaScriptコードに追加する人がいることに気づきました。ステートメントを追加すると、エラーが表示されなくなりました。残念ながら、Googleはこの文字列ステートメントの背後にある歴史の多くを明らかにしませんでした。確かに、JavaScriptがブラウザによってどのように解釈されるかと関係があるはずですが、その効果がどうなるかはわかりません。

それで、それは"use strict";何についてであり、それは何を意味しますか、そしてそれはまだ関連していますか?

現在のブラウザのいずれかが文字列に応答し"use strict";ますか、それとも将来使用するためですか?

4

29 に答える 29

5293

ES6モジュールの更新

ネイティブECMAScriptモジュールimportおよびexportステートメント付き)およびES6クラス内では、厳密モードは常に有効であり、無効にすることはできません。

元の回答

Javascript Strict Modeに関するこの記事は、興味があるかもしれません:John Resig-ECMAScript 5 Strict Mode、JSONなど

いくつかの興味深い部分を引用するには:

厳密モードはECMAScript5の新機能であり、プログラムまたは関数を「厳密な」操作コンテキストに配置できます。この厳密なコンテキストは、特定のアクションが実行されるのを防ぎ、より多くの例外をスローします。

と:

厳密モードは、いくつかの点で役立ちます。

  • いくつかの一般的なコーディングNG集をキャッチし、例外をスローします。
  • 比較的「安全でない」アクション(グローバルオブジェクトへのアクセスの取得など)が実行された場合に、エラーを防止またはスローします。
  • 紛らわしい、またはよく考えられていない機能を無効にします。

また、ファイル全体に「厳密モード」を適用できることにも注意してください...または、特定の機能にのみ使用できます(John Resigの記事から引用)

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code...

古いコードと新しいコードを混在させる必要がある場合は、これが役立つ可能性があります;-)

ですから、"use strict"Perlで使用できるものに少し似ていると思います(そのため、名前は?):破損につながる可能性のあるものをより多く検出することで、エラーを減らすのに役立ちます。

厳密モードは、すべての主要なブラウザでサポートされるようになりました

于 2009-08-26T16:15:39.370 に答える
1364

これはECMAScript5の新機能です。JohnResigがその要約を書きました。

これは、JavaScriptファイル(ファイルの先頭または関数内)に入力する文字列であり、次のようになります。

"use strict";

これをコードに入れても、単なる文字列であるため、現在のブラウザで問題が発生することはありません。コードがプラグマに違反している場合、将来的にコードに問題が発生する可能性があります。たとえば、現在最初にfoo = "bar"定義せずに持っている場合foo、コードは失敗し始めます...これは私の意見では良いことです。

于 2009-08-26T16:14:23.880 に答える
773

このステートメント"use strict"; は、JavaScriptの縮小されたより安全な機能セットであるStrictモードを使用するようにブラウザーに指示します。

機能のリスト(非網羅的)

  1. グローバル変数を禁止します。(変数名の欠落しているvar宣言とタイプミスをキャッチします)

  2. サイレントに失敗した割り当ては、厳密モードでエラーをスローします(割り当てNaN = 5;

  3. 削除できないプロパティを削除しようとすると、(delete Object.prototype)がスローされます

  4. オブジェクトリテラル内のすべてのプロパティ名が一意である必要があります(var x = {x1: "1", x1: "2"}

  5. 関数パラメーター名は一意である必要があります(function sum (x, x) {...}

  6. 8進構文を禁止します(var x = 023;一部の開発者は、先行ゼロは数値を変更しないと誤って想定しています)。

  7. withキーワードを禁止します

  8. eval厳密モードでは、新しい変数は導入されません

  9. プレーンネームの削除を禁止します(delete x;

  10. いかなる形式の名前evalの拘束または割り当ても禁止しますarguments

  11. arguments厳密モードでは、オブジェクトのプロパティを正式なパラメータでエイリアスしません。(たとえば、にバインドされてfunction sum (a,b) { return arguments[0] + b;}いるため、これは機能します。)arguments[0]a

  12. arguments.calleeサポートされていません

[参照:厳密モードMozilla Developer Network ]

于 2014-11-24T21:22:08.303 に答える
458

人々がそれを使用することを心配しているなら、use strictそれはこの記事をチェックする価値があるかもしれません:

ECMAScript5ブラウザでの「厳密モード」のサポート。これは何を意味するのでしょうか?
NovoGeek.com-クリシュナのウェブログ

ブラウザのサポートについて説明していますが、さらに重要なのは、ブラウザのサポートを安全に処理する方法です。

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/
于 2012-07-15T23:25:53.957 に答える
243

注意点として、プログラマーを苦しめているすべての人:"use strict"既存のコードに適用することは危険な場合があります!これは、コードを「より良く」するためにコードを叩くことができる、心地よい、幸せそうな顔のステッカーではありません。プラグマを使用"use strict"すると、ブラウザは、デフォルト/緩いJavaScriptが喜んで許可するが、厳密なJavaScriptが嫌いなことをしているという理由だけで、以前はスローしなかったランダムな場所に突然例外をスローします。コード内でめったに使用されない呼び出しに隠れている厳密性違反がある場合があります。これは、最終的に実行された場合にのみ例外をスローします。たとえば、有料の顧客が使用する本番環境ではそうです。

思い切って取り組む場合は、"use strict"包括的な単体テストと厳密に構成されたJSHintビルドタスクと一緒に適用することをお勧めします。これにより、モジュールの暗いコーナーが、あなただけでひどく爆発することはないという確信が得られます。厳密モードをオンにしました。または、別のオプション"use strict"があります。レガシーコードを追加しないでください。正直なところ、その方がおそらく安全です。 サードパーティのモジュールのように、所有または保守していないモジュールには絶対に追加しないでください。"use strict"

それは致命的な檻に入れられた動物であるにもかかわらず、"use strict"良いものになる可能性があると思いますが、あなたはそれを正しくしなければなりません。厳密にするのに最適な時期は、プロジェクトがグリーンフィールドであり、ゼロから始めているときです。すべての警告とオプションをチームが可能な限り厳しく調整して構成JSHint/JSLintし、のように適切なビルド/テスト/アサートシステムを構築してGrunt+Karma+Chaiから、すべての新しいモジュールをとしてマークし始めます"use strict"。ぎこちないエラーや警告の多くを治す準備をしてください。JSHint/JSLint違反が発生した場合にビルドがFAILになるように構成して、全員が重要性を理解していることを確認してください。

私が採用したとき、私のプロジェクトはグリーンフィールドプロジェクトではありませんでした"use strict"。その結果、モジュールの半分がないため、IDEは赤いマークでいっぱいに"use strict"なり、JSHintはそれについて不平を言います。これは、将来リファクタリングを行う必要があることを思い出させてくれます。私の目標は、すべての"use strict"ステートメントが欠落しているためにレッドマークをなくすことですが、それはもう何年も先のことです。

于 2014-03-03T07:37:19.963 に答える
226

使用'use strict';しても、コードが突然改善されることはありません。

JavaScriptの厳密モードは、ECMAScript5の機能です。スクリプト/関数の先頭でこれを宣言することにより、厳密モードを有効にできます。

'use strict';

JavaScriptエンジンがこのディレクティブを認識すると、特別なモードでコードの解釈を開始します。このモードでは、潜在的なバグになる可能性のある特定のコーディング手法が検出されたときにエラーがスローされます(これが厳密モードの背後にある理由です)。

この例を考えてみましょう。

var a = 365;
var b = 030;

数値リテラルを並べるという彼らの執着の中で、開発者は誤って変数bを8進数のリテラルで初期化しました。非厳密モードは、これを値24(10進数)の数値リテラルとして解釈します。ただし、strictモードではエラーがスローされます。

厳密モードの専門分野の非網羅的なリストについては、この回答を参照してください。


どこで使えばいい'use strict';ですか?

  • 私の新しいJavaScriptアプリケーションでは:もちろんです!厳密モードは、コードで愚かなことをしているときに内部告発者として使用できます。

  • の既存のJavaScriptコードでは:おそらくそうではありません!既存のJavaScriptコードに、strictモードで禁止されているステートメントが含まれている場合、アプリケーションは単純に機能しなくなります。厳密モードが必要な場合は、既存のコードをデバッグして修正する準備をしておく必要があります。これが、使用'use strict';してもコードが突然改善されない理由です。


厳密モードを使用するにはどうすればよいですか?

  1. 'use strict';スクリプトの上にステートメントを挿入します。

     // File: myscript.js
    
     'use strict';
     var a = 2;
     ....
    

    ファイル内のすべてがmyscript.js厳密モードで解釈されることに注意してください。

  2. または、'use strict';関数本体の上にステートメントを挿入します。

     function doSomething() {
         'use strict';
         ...
     }
    

    関数の字句スコープ内のすべては、doSomething厳密モードで解釈されます。ここでは、語彙スコープという単語が重要です。たとえば、strictコードがstrictではないライブラリの関数を呼び出す場合、呼び出された関数ではなく、コードのみがstrictモードで実行されます。より良い説明については、この回答を参照してください。


ストリクトモードで禁止されていることは何ですか?

厳密モードで禁止されているいくつかのことを説明する素晴らしい記事を見つけました(これは完全なリストではないことに注意してください)。

範囲

歴史的に、JavaScriptは関数のスコープ方法について混乱してきました。静的にスコープされているように見えることもありますが、一部の機能では、動的にスコープされているように動作します。これは混乱を招き、プログラムを読んだり理解したりするのを難しくします。誤解はバグを引き起こします。パフォーマンスの問題でもあります。静的スコープでは、コンパイル時に変数バインディングを実行できますが、動的スコープの要件により、バインディングを実行時に延期する必要があり、パフォーマンスが大幅に低下します。

厳密モードでは、すべての変数バインディングを静的に実行する必要があります。つまり、以前は動的バインディングが必要だった機能を削除または変更する必要があります。具体的には、withステートメントが削除され、eval関数が呼び出し元の環境を改ざんする機能が大幅に制限されます。

厳密なコードの利点の1つは、YUICompressorなどのツールがコードを処理 するときに優れた仕事をすることができることです。

暗黙のグローバル変数

JavaScriptはグローバル変数を暗示しています。変数を明示的に宣言しない場合、グローバル変数が暗黙的に宣言されます。これにより、初心者は基本的なハウスキーピングの雑用の一部を無視できるため、プログラミングが容易になります。ただし、大規模なプログラムの管理がはるかに困難になり、信頼性が大幅に低下します。したがって、厳密モードでは、暗黙のグローバル変数は作成されなくなります。すべての変数を明示的に宣言する必要があります。

グローバルリーク

this グローバルオブジェクトにバインドされる可能性のある状況がいくつかあります。たとえばnew、コンストラクター関数を呼び出すときにプレフィックスを指定し忘れた場合、コンストラクターthisは予期せずにグローバルオブジェクトにバインドされるため、新しいオブジェクトを初期化する代わりに、グローバル変数をサイレントに改ざんします。このような状況では、代わりにstrictモードがにバインドthisされますundefined。これにより、コンストラクターは代わりに例外をスローし、エラーをより早く検出できるようになります。

騒々しい失敗

Object.createProperty JavaScriptには常に読み取り専用のプロパティがありましたが、ES5の関数がその機能を公開するまで、JavaScriptを自分で作成することはできませんでした。読み取り専用プロパティに値を割り当てようとすると、サイレントに失敗します。割り当てによってプロパティの値が変更されることはありませんが、プログラムは変更されたかのように続行されます。これは完全性の危険であり、プログラムが一貫性のない状態になる可能性があります。厳密モードでは、読み取り専用プロパティを変更しようとすると、例外がスローされます。

オクタル

数値の8進数(または8進数)表現は、ワードサイズが3の倍数であるマシンでマシンレベルのプログラミングを行う場合に非常に役立ちました。ワードサイズが60ビットのCDC6600メインフレームで作業する場合は8進数が必要でした。8進数を読み取ることができれば、単語を20桁で見ることができます。2桁はオペコードを表し、1桁は8つのレジスタの1つを識別しました。機械語から高級言語への移行が遅い間、プログラミング言語で8進形式を提供することは有用であると考えられていました。

Cでは、非常に不幸なオクタルネスの表現が選択されました。先行ゼロ。したがって、Cでは、0100100ではなく64を意味し08、8ではなくエラーです。さらに残念なことに、この時代錯誤は、エラーの作成にのみ使用されるJavaScriptを含むほぼすべての現代言語にコピーされています。他の目的はありません。したがって、厳密モードでは、8進数形式は許可されなくなりました。

その他

引数の疑似配列は、ES5ではもう少し配列のようになります。callee厳密モードでは、プロパティとプロパティが失われcaller ます。これによりarguments、多くの機密コンテキストを放棄することなく、信頼できないコードにあなたを渡すことが可能になります。また、 arguments関数のプロパティが削除されます。

strictモードでは、関数リテラルのキーが重複すると構文エラーが発生します。関数は、同じ名前の2つのパラメーターを持つことはできません。関数は、そのパラメーターの1つと同じ名前の変数を持つことはできません。関数はdeleteそれ自身の変数を持つことはできません。構成不可能なプロパティを試行すると delete、例外がスローされるようになりました。プリミティブ値は暗黙的にラップされません。


将来のJavaScriptバージョンの予約語

ECMAScript 5は、予約語のリストを追加します。それらを変数または引数として使用する場合、strictモードはエラーをスローします。予約語は次のとおりです。

implements、、、、、、、、、、およびinterface_ let_ package_ private_ protected_ public_staticyield


参考文献

于 2016-01-29T11:35:48.273 に答える
154

すべての開発者が今すぐ厳密モードの使用を開始することを強くお勧めします。それをサポートするブラウザは十分にあるので、厳密モードは、コードに含まれていることすら知らなかったエラーから私たちを合法的に救うのに役立ちます。

どうやら、初期段階では、これまでに遭遇したことのないエラーが発生するでしょう。最大限のメリットを得るには、厳密モードに切り替えた後に適切なテストを実行して、すべてをキャッチしたことを確認する必要があります。間違いなく、コードを投入use strictしてエラーがないと想定するだけではありません。つまり、この非常に便利な言語機能を使用して、より優れたコードを記述し始めるときが来たのです。

例えば、

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

JSLintは、DouglasCrockfordによって作成されたデバッガーです。スクリプトを貼り付けるだけで、コード内の目立った問題やエラーをすばやくスキャンできます。

于 2013-07-05T19:38:24.830 に答える
109

他の答えを補完する、もう少し根拠のある答えを提供したいと思います。最も人気のある回答を編集したいと思っていましたが、失敗しました。私はそれをできるだけ包括的で完全なものにしようとしました。

詳細については、 MDNのドキュメントを参照してください。

"use strict"ECMAScript5で導入されたディレクティブ。

ディレクティブはステートメントに似ていますが、異なります。

  • use strictキーワードが含まれていません:ディレクティブは、特殊な文字列リテラル(一重引用符または二重引用符)で構成される単純な式ステートメントです。ECMAScript 5を実装していないJavaScriptエンジンは、副作用のない式ステートメントを表示するだけです。ECMAScript標準の将来のバージョンではuse、実際のキーワードとして導入されることが期待されています。これにより、引用符は廃止されます。
  • use strictスクリプトまたは関数の先頭でのみ使用できます。つまり、他のすべての(実際の)ステートメントの前に置く必要があります。関数のスクリプトの最初の命令である必要はありません。文字列リテラルで構成される他のステートメント式を前に付けることができます(JavaScript実装はそれらを実装固有のディレクティブとして扱うことができます)。(スクリプトまたは関数内の)最初の実際のステートメントに続く文字列リテラルステートメントは、単純な式ステートメントです。通訳者はそれらをディレクティブとして解釈してはならず、効果はありません。

このuse strictディレクティブは、次のコード(スクリプトまたは関数内)が厳密なコードであることを示しています。スクリプトの最上位レベルのコード(関数に含まれていないコード)は、スクリプトにuse strictディレクティブが含まれている場合、厳密なコードと見なされます。use strict関数自体が厳密なコードで定義されている場合、または関数にディレクティブが含まれている場合、関数の内容は厳密なコードと見なされます。eval()メソッドに渡されるコードeval()は、厳密なコードから呼び出された場合、またはuse strictディレクティブ自体が含まれている場合、厳密なコードと見なされます。

ECMAScript 5のstrictモードは、JavaScript言語の制限されたサブセットであり、言語の関連する欠陥を排除し、より厳密なエラーチェックとより高いセキュリティを備えています。以下に、厳密モードと通常モードの違いを示します(最初の3つは特に重要です)。

  • withstrictモードでは-statementを使用できません。
  • 厳密モードでは、すべての変数を宣言する必要があります。変数、関数、関数パラメーター、catch-clauseパラメーター、またはグローバルのプロパティとして宣言されていない識別子に値を割り当てると、Objectが取得されReferenceErrorます。通常モードでは、識別子は暗黙的にグローバル変数として宣言されます(グローバルのプロパティとしてObject
  • 厳密モードでは、キーワードは、関数として(メソッドとしてではなく)呼び出された関数thisの値を持ちます。undefined(通常モードthisでは、常にグローバルを指しますObject)。この違いを使用して、実装が厳密モードをサポートしているかどうかをテストできます。
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • また、関数がstrictモードでcall()またはapplystrictモードで呼び出された場合、それはor呼び出しthisの最初の引数の値とまったく同じです。(通常モードでは、グローバルに置き換えられ、オブジェクトではない値がオブジェクトにキャストされます。)call()apply()nullundefinedObject

  • 厳密モードではTypeError、読み取り専用プロパティに割り当てようとしたり、拡張不可能なオブジェクトの新しいプロパティを定義したりしようとすると、が表示されます。(通常モードでは、どちらもエラーメッセージなしで失敗します。)

  • 厳密モードでは、コードをに渡すときeval()に、呼び出し元のスコープで変数または関数を宣言または定義することはできません(通常モードで行うことができます)。代わりに、新しいスコープが作成されeval()、変数と関数はそのスコープ内にあります。そのスコープは、eval()実行が終了すると破棄されます。
  • 厳密モードでは、関数のarguments-objectには、その関数に渡される値の静的コピーが含まれます。通常モードでは、arguments-objectはやや「魔法のような」振る舞いをします。配列の要素と名前付き関数パラメーターは両方とも同じ値を参照します。
  • 厳密モードではSyntaxErrordelete演算子の後に修飾されていない識別子(変数、関数、または関数パラメーター)が続く場合にを取得します。通常モードでは、delete式は何もせず、に評価されfalseます。
  • 厳密モードではTypeError、構成不可能なプロパティを削除しようとすると、が表示されます。(通常モードでは、試行は単に失敗し、delete式はに評価されfalseます)。
  • 厳密モードでは、オブジェクトリテラルに同じ名前で複数のプロパティを定義しようとすると、構文エラーと見なされます。(通常モードではエラーはありません。)
  • 厳密モードでは、関数宣言に同じ名前の複数のパラメーターがある場合、構文エラーと見なされます。(通常モードではエラーはありません。)
  • 厳密モードでは、8進リテラルは許可されません(これらは。で始まるリテラル0xです(通常モードでは、一部の実装では8進リテラルが許可されます)。
  • 厳密モードでは、識別子evalargumentsはキーワードのように扱われます。それらの値を変更したり、値を割り当てたり、catchブロックの変数、関数、関数パラメーター、または識別子の名前として使用したりすることはできません。
  • 厳密モードでは、コールスタックを調べる可能性に対する制限が増えます。厳密モードの関数でaarguments.callerarguments.callee引き起こします。TypeErrorさらに、strictモードの関数の一部のcaller-およびargumentsプロパティは、TypeErrorそれらを読み取ろうとするとaを引き起こします。
于 2015-05-15T06:58:03.453 に答える
94

私の2セント:

ストリクトモードの目標の1つは、問題のデバッグを高速化できるようにすることです。それはあなたのウェブページの静かで奇妙な振る舞いを引き起こす可能性のある特定の間違ったことが起こったときに例外を投げることによって開発者を助けます。を使用するuse strictと、コードはエラーをスローし、開発者が事前に修正するのに役立ちます。

使用後に学んだ重要なことuse strict

グローバル変数宣言の防止:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

現在、このコードはnameoftree、を使用してアクセスできるグローバルスコープで作成されますwindow.nameoftree。コードを実装use strictすると、エラーがスローされます。

Uncaught ReferenceError:nameoftreeが定義されていません

Sample

withステートメントを削除します:

withuglify-jsなどのツールを使用してステートメントを縮小することはできません。また、非推奨になり、将来のJavaScriptバージョンから削除されます。

Sample

重複を防ぎます:

プロパティが重複している場合、例外がスローされます

Uncaught SyntaxError:オブジェクトリテラルの重複データプロパティは厳密モードでは許可されていません

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

他にもいくつかありますが、それについてもっと知識を得る必要があります。

于 2014-10-21T13:31:24.747 に答える
71

昨年リリースされたブラウザを使用している場合は、JavaScriptStrictモードをサポートしている可能性があります。ECMAScript 5が現在の標準になる前の古いブラウザだけが、それをサポートしていません。

コマンドを引用符で囲むと、コードが古いブラウザーでも機能することが保証されます(ただし、厳密モードで構文エラーが発生すると、通常、古いブラウザーではスクリプトが誤動作し、検出が困難になります)。

于 2012-03-10T03:31:15.407 に答える
66

を追加すると、スクリプトが実行される前に、次の場合にSyntaxError"use strict";がスローされます。

  • 新しく予約されたキーワードの1つを使用して(ECMAScript 6の予見で)将来のimplementsECMAScriptバージョンへの道を開く:、、、、、、、、、、、。interfaceletpackageprivateprotectedpublicstaticyield

  • ブロックで関数を宣言する

    if(a<b){ function f(){} }
    
  • 8進構文

    var n = 023;
    
  • thisグローバルオブジェクトをポイントします。

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    
  • オブジェクトリテラルのプロパティ名に同じ名前を2回宣言する

     {a: 1, b: 3, a: 7} 
    

    これは、ECMAScript 6(バグ1041128)には当てはまりません。

  • 同じ名前の関数で2つの関数の引数を宣言する

    f(a, b, b){}
    
  • 宣言されていない変数に値を設定する

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • delete変数名での使用delete myVariable;

  • evalまたはargumentsを変数または関数の引数名として使用する

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 
    

出典:

于 2015-12-23T03:10:38.823 に答える
61

"厳密に使用"; プログラマーがJavaScriptの緩いまたは悪い特性を使用しないという保険です。定規が直線を作るのを助けるように、それはガイドです。「UseStrict」は「Straightcoding」を行うのに役立ちます。

ルーラーを使用して行をまっすぐにすることを好まない人は、通常、他の人にコードをデバッグするように求めるページに行き着きます。

私を信じてください。設計が不十分なコードと比較して、オーバーヘッドはごくわずかです。数年間JavaScriptの上級開発者であるDougCrockfordは、ここに非常に興味深い投稿をしています。個人的には、いつも彼のサイトに戻って、自分の良い習慣を忘れないようにしています。

最新のJavaScriptプラクティスは、常に「厳密な使用」を呼び起こす必要があります。プラグマ。ECMAグループが「厳密」モードをオプションにした唯一の理由は、経験の浅いコーダーがJavaScriptにアクセスできるようにし、新しいより安全なコーディング手法に適応する時間を与えるためです。

于 2013-05-31T18:29:33.943 に答える
61

厳密モードでは、通常のJavaScriptセマンティクスにいくつかの変更が加えられます。

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

  • JavaScriptエンジンが最適化を実行するのを困難にする間違いを修正します。

  • ECMAScriptの将来のバージョンで定義される可能性のある一部の構文を禁止します。

詳細については、StrictMode- Javascriptを参照してください。

于 2014-03-27T12:18:30.063 に答える
55

この時点からすべての機密JavaScriptファイルの先頭に含めるuse strictことは、より優れたJavaScriptプログラマーになり、確率変数がグローバルになり、物事が静かに変化するのを防ぐための小さな方法です。

于 2014-09-05T12:53:26.697 に答える
47

w3schoolsからの引用

「厳密な使用」指令

「usestrict」ディレクティブは、JavaScript 1.8.5(ECMAScriptバージョン5)の新機能です。

これはステートメントではなく、以前のバージョンのJavaScriptでは無視されていたリテラル式です。

「厳密に使用」の目的は、コードを「厳密モード」で実行する必要があることを示すことです。

strictモードでは、たとえば、宣言されていない変数を使用することはできません。

なぜ厳密モードなのか?

厳密モードを使用すると、「安全な」JavaScriptを簡単に作成できます。

厳密モードでは、以前に受け入れられていた「不正な構文」が実際のエラーに変更されます。

例として、通常のJavaScriptでは、変数名を誤って入力すると、新しいグローバル変数が作成されます。厳密モードでは、これによりエラーがスローされ、誤ってグローバル変数を作成することはできなくなります。

通常のJavaScriptでは、開発者は書き込み不可能なプロパティに値を割り当てるエラーフィードバックを受け取りません。

厳密モードでは、書き込み不可のプロパティ、ゲッターのみのプロパティ、存在しないプロパティ、存在しない変数、または存在しないオブジェクトへの割り当てはエラーをスローします。

詳細については、 http://www.w3schools.com/js/js_strict.aspを参照してください。

于 2015-04-29T10:10:19.480 に答える
41

"use strict"JavaScriptコードを厳密モードで実行するようにします。これは、基本的に、使用する前にすべてを定義する必要があることを意味します。厳密モードを使用する主な理由は、未定義のメソッドが誤ってグローバルに使用されないようにするためです。

また、厳密モードでは、処理が速くなり、一部の警告またはサイレント警告が致命的なエラーをスローします。常にそれを使用して、より適切なコードを作成することをお勧めします。

"use strict"ECMA5では広く使用する必要があります。ECMA6ではデフォルトでJavaScriptの一部であるため、ES6を使用している場合は追加する必要はありません。

MDNからのこれらのステートメントと例を見てください。


usestrict」ディレクティブ「usestrict」ディレクティブは、JavaScript 1.8.5(ECMAScriptバージョン5)の新機能です。これはステートメントではなく、以前のバージョンのJavaScriptでは無視されていたリテラル式です。「厳密に使用」の目的は、コードを「厳密モード」で実行する必要があることを示すことです。strictモードでは、たとえば、宣言されていない変数を使用することはできません。

「usestrict 」の使用例:
関数の厳密モード:同様に、関数の厳密モードを呼び出すには、正確なステートメント「usestrict」を入力します。(または'use strict';)他のステートメントの前に関数の本体で。

1)関数の厳密モード

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2)全スクリプト厳密モード

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3)書き込み不可能なグローバルへの割り当て

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

MDNで詳細を読むことができます。

于 2017-05-22T12:38:35.987 に答える
33

ECMAScript委員会に参加していた一部の人々による良い話があります:JavaScriptの変更、パート1:ECMAScript 5 ""use strict"スイッチを段階的に使用することで、 JavaScriptの実装者がすべてのWebサイトを突然壊すことなくJavaScriptの多くの危険な機能をクリーンアップする方法について世界中。

もちろん、それらの機能不全の多くが(何であったか)、ECMAScript5がそれらをどのように修正するかについても説明します。

于 2014-03-29T00:47:24.887 に答える
29

比較する小さな例:

非厳密モード:

for (i of [1,2,3]) console.log(i)
    
// output:
// 1
// 2
// 3

厳密モード:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

非厳密モード:

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true

于 2016-08-21T21:43:24.477 に答える
21

これはEcmaScript5use strictで導入され、それ以降も維持されていることに注意してください。

以下は、ES6およびES7で厳密モードをトリガーするための条件です。

  • グローバルコードは、Use Strict Directiveを含むDirectivePrologueで始まる場合、厳密モードコードです(14.1.1を参照)。
  • モジュールコードは常に厳密なモードコードです。
  • ClassDeclarationまたはClassExpressionのすべての部分は、厳密なモードコードです。
  • Evalコードは、Use Strict Directiveを含むディレクティブプロローグで始まる場合、またはevalの呼び出しがstrictモードコードに含まれる直接eval(12.3.4.1を参照)である場合、strictモードコードです。
  • 関連するFunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、MethodDefinition、またはArrowFunctionがstrictモードコードに含まれている場合、または関数の[[ECMAScriptCode]]内部スロットの値を生成するコードがディレクティブプロローグで始まる場合、関数コードは厳密モードコードです。 UseStrictDirectiveが含まれています。
  • 組み込みのFunctionおよびGeneratorコンストラクターへの引数として提供される関数コードは、最後の引数が処理時にUse Strictディレクティブを含むディレクティブプロローグで始まるFunctionBodyである文字列である場合、厳密モードコードです。
于 2016-04-12T00:25:07.760 に答える
15

開発者が使用する必要がある主な理由は次の"use strict"とおりです。

  1. グローバル変数の誤った宣言を防ぎます。を使用すると、使用前に"use strict()"変数がで宣言されていることを確認できます。var例えば:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
    
  2. 注意:"use strict"ディレクティブは、スクリプトまたは関数の先頭でのみ認識されます。
  3. 文字列"arguments"を変数として使用することはできません。

    "use strict";
    var arguments = 3.14;    // This will cause an error
    
  4. 変数としてのキーワードの使用を制限します。それらを使用しようとすると、エラーがスローされます。

つまり、コードのエラーが発生しにくくなり、優れたコードを記述できるようになります。

詳細については、こちらを参照してください。

于 2016-11-18T09:53:55.237 に答える
14

use strict期待どおりに機能しない危険な機能を使用できないため、コードをより安全にする方法です。そして、以前に書かれたように、それはコードをより厳密にします。

于 2016-05-17T22:31:29.230 に答える
13

JavaScriptの「厳密な」モードがECMAScript5で導入されました。

(function() {
  "use strict";
  your code...
})();

JSファイルの一番上に書き込む"use strict";と、厳密な構文チェックがオンになります。それは私たちのために次のタスクを実行します。

  1. 宣言されていない変数に割り当てようとすると、エラーが表示されます

  2. 主要なJSシステムライブラリを上書きするのを防ぎます

  3. 安全でない、またはエラーが発生しやすい言語機能を禁止します

use strict個々の機能の内部でも機能します。コードに含めることは常に良い習慣use strictです。

ブラウザの互換性の問題:「use」ディレクティブは下位互換性があることを意図しています。それらをサポートしていないブラウザには、それ以上参照されていない文字列リテラルが表示されます。それで、彼らはそれを通り過ぎて先に進みます。

于 2016-11-11T05:40:45.873 に答える
12

"厳密に使用"; JavaScriptをもう少し堅牢にするためのECMAの取り組みです。それはJSにそれを少なくとも少し「厳密」にする試みをもたらします(他の言語は90年代以来厳密な規則を実装しています)。実際には、JavaScript開発者にある種のコーディングのベストプラクティスに従うように「強制」します。それでも、JavaScriptは非常に壊れやすいものです。型変数や型メソッドなどはありません。JavaScript開発者には、JavaやActionScript3などのより堅牢な言語を学び、JavaScriptコードに同じベストプラクティスを実装することを強くお勧めします。これにより、動作が向上し、簡単になります。デバッグ。

于 2016-05-03T12:59:03.853 に答える
12

通常、JavaScriptは厳密なルールに従わないため、エラーが発生する可能性が高くなります。を使用した後"use strict"、JavaScriptコードは、ターミネータの使用、初期化前の宣言など、他のプログラミング言語と同様に、一連の厳密なルールに従う必要があります。

を使用する場合"use strict"は、厳密なルールセットに従ってコードを記述し、エラーやあいまいさの可能性を減らす必要があります。

于 2016-11-20T16:23:54.853 に答える
11

Use Strictは、一般的なエラーと繰り返されるエラーを表示するために使用されるため、処理方法が異なり、Javaスクリプトの実行方法が変更されます。このような変更は次のとおりです。

  • 偶発的なグローバルを防止します

  • 重複はありません

  • で排除

  • この強制を排除します

  • より安全なeval()

  • 不変のエラー

詳細については、この記事を読むこともできます

于 2016-10-17T13:59:15.043 に答える
7

"厳密に使用"; JavaScriptコードを「厳密モード」で実行する必要があることを定義します。

  • 「usestrict」ディレクティブは、ECMAScriptバージョン5の新機能です。
  • これはステートメントではなく、以前のバージョンのJavaScriptでは無視されていたリテラル式です。
  • 「厳密に使用」の目的は、コードを「厳密モード」で実行する必要があることを示すことです。
  • strictモードでは、たとえば、宣言されていない変数を使用することはできません。

Internet Explorer 9以下を除いて、すべての最新のブラウザは「厳密な使用」をサポートしています。

不利益

開発者が厳密モードのライブラリを使用したが、開発者が通常モードでの作業に慣れている場合、期待どおりに機能しないライブラリに対していくつかのアクションを呼び出す可能性があります。

さらに悪いことに、開発者は通常モードであるため、余分なエラーがスローされるという利点がなく、エラーがサイレントに失敗する可能性があります。

また、上記のように、厳密モードでは特定の操作を実行できなくなります。

人々は一般的に、そもそもそれらを使用すべきではないと考えていますが、一部の開発者は制約が気に入らず、言語のすべての機能を使用したいと考えています。

于 2019-01-28T10:42:25.557 に答える
4

厳密モードでは、メモリリークを防ぐことができます。

非厳密モードで記述された以下の関数を確認してください。

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

この関数ではname、関数内で呼び出される変数を使用しています。内部的には、コンパイラは最初に、その特定の関数スコープにその特定の名前で宣言された変数があるかどうかをチェックします。コンパイラはそのような変数がないことを理解したので、外部スコープをチェックインします。私たちの場合、それはグローバルスコープです。繰り返しになりますが、コンパイラは、その名前でグローバルスペースに宣言された変数がないことも理解したため、グローバルスペースにそのような変数を作成します。概念的には、この変数はグローバルスコープで作成され、アプリケーション全体で使用できるようになります。

別のシナリオは、たとえば、変数が子関数で宣言されている場合です。その場合、コンパイラは外部スコープ、つまり親関数でその変数の有効性をチェックします。そうして初めて、グローバルスペースをチェックインし、そこで変数を作成します。つまり、追加のチェックを行う必要があります。これは、アプリケーションのパフォーマンスに影響します。


それでは、同じ関数を厳密モードで記述しましょう。

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

次のエラーが発生します。

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

ここで、コンパイラは参照エラーをスローします。strictモードでは、コンパイラーは変数を宣言せずに使用することを許可しません。したがって、メモリリークを防ぐことができます。さらに、より最適化されたコードを書くことができます。

于 2019-07-08T08:46:51.390 に答える
4

厳密モードでは、非厳密モードでは無視されるエラーが排除されるため、JavaScriptが「より安全」になります。

それはベストプラクティスの中で考慮されていますか?

はい、JavaScriptを使用して厳密モードを含める場合のベストプラクティスの一部と見なされます。これは、JSファイルに以下のコード行を追加することで実行されます。

'use strict';

あなたのコードで。

ユーザーエージェントにとってそれはどういう意味ですか?

コードを厳密モードで解釈する必要があることを示すと、ブラウザなどのユーザーエージェントは、コードを文字通り記述されたものとして扱い、コードが意味をなさない場合はエラーをスローする必要があります。

例:.jsファイルに次のコードがあるとします。

シナリオ1:[厳密モードなし]

var city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

シナリオ2:[厳密モードなし]

city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

では、なぜ両方の場合に変数名が出力されるのでしょうか。

厳密モードをオンにしないと、ユーザーエージェントは、問題のあるコードを理解するために、問題のあるコードに一連の変更を加えることがよくあります。一見すると、これはすばらしいことのように思えます。実際、strictモードの外で作業することで、細部を完全に特定することなく、JavaScriptコードで足を濡らすことができます。ただし、開発者として、コードにバグを残したくありません。後で戻ってきて噛み付く可能性があることを知っているからです。また、良いコードを書きたいだけです。そして、それが厳密モードが役立つところです。

シナリオ3:[厳密モード]

'use strict';

city = "Chicago"
console.log(city) // Reference Error: asignment is undeclared variable city.

追加のヒント:厳密モードを使用してコードの品質を維持するために、特に複数のファイルがある場合は、これを何度も書き込む必要はありません.js。次のように、ルールでこのルールをグローバルにeslintます。

ファイル名: .eslintrc.js

module.exports = {
    env: {
        es6: true
    },
    rules : {
        strict: ['error', 'global'],
        },
    };
    

さて、厳密モードでは何が防止されますか?

  • 宣言せずに変数を使用すると、strictモードでエラーがスローされます。これは、アプリケーション全体で意図せずにグローバル変数を作成することを防ぐためです。シカゴを印刷する例は、特にこれをカバーしています。

  • 変数、関数、または引数を削除することは、厳密モードではノーノーです。

    "use strict";
     function x(p1, p2) {}; 
     delete x; // This will cause an error
    
  • ストリクトモードでは、パラメータ名を複製することできません。

     "use strict";
     function x(p1, p1) {};   // This will cause an error
    
  • Javascript言語の予約語は、strictモードでは許可されていません。言葉は、インターフェイス、let、packages、private、protected、publicを実装します。静的、および歩留まり

より包括的なリストについては、ここでMDNドキュメントを確認してください:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

于 2020-07-10T07:21:29.110 に答える
4

JavaScriptは、ブラウザ戦争と不適切な管理のために急いで設計および実装されました。その結果、多くの不十分な設計上の決定、直感的でない構文、および紛らわしいセマンティクスが言語に浸透しました。厳密モードは、これらの間違いのいくつかを修正することを目的としています。

ただし、代替の解釈を作成せずにこれらの間違いを修正すると、下位互換性が失われます。したがって、"use strict"directiveは、コードをプログラマーに伝達しながら、コードの代替解釈を作成します。

たとえば、thiskeywordsは、他の言語と同様に、thisまたはself他の言語でのメソッド定義内のオブジェクトを参照します。

let o = {
  name: 'John Doe',
  sayName: function(){
    console.log(this.name);
  }
};

o.sayName(); // 'John Doe'

thisメソッドコンテキスト以外の目的はありませんが、すべてのJavaScript関数thisには、メソッドであるかどうかに関係なくキーワードがあります。

function run() {
  console.log(this);
}

run(); // Window

ここでthisは、グローバルオブジェクトがスコープ内ですでに使用可能であるため、意味がなく、目的を果たさないグローバルオブジェクトに解決されます。

グローバル関数の厳密モードthisでは、未定義に解決されます。これは、私たちが期待していることです。

"use strict"

function run() {
  console.log(this);
}

run(); // undefined

"strict mode"ディレクティブを無視するため、古いブラウザでは構文が有効である必要があるため、厳密モードでも修正できない誤りがあります。これは仕様によるものです。

于 2021-07-25T07:14:24.373 に答える