では使用厳しいJavaScriptではどのようなものと推論さんにお話をうかがった。

StackOverflow https://stackoverflow.com/questions/1335851

質問

最近行ったものJavaScriptコードをCrockfordの JSLint, ができたことは以下のようなエラー:

問題行1字1:不使用"厳しい"です。

この検索の実現に向け、まだまだ一部の人の追加 "use strict"; そのJavaScriptコードです。一度とし、エラー停止。残念ながら、Googleからの歴史をこの文字列です。確かに持つものでなければならないか、JavaScriptが解釈されるブラウザによっては、その効果となってしまいます。

教えてください "use strict"; すべてからずとも、まだまだですね。

いず、現在のブラウザへの対応 "use strict"; 文字列または今後も使用できるように?

役に立ちましたか?

解決

Javascript Strict モードに関する次の記事に興味があるかもしれません。 John Resig - ECMAScript 5 Strict モード、JSON など

興味深い部分をいくつか引用すると、

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

そして:

Strict モードは、次のような点で役立ちます。

  • これは、例外をスローする、いくつかの一般的なコーディングの失敗を検出します。
  • 比較的「安全でない」アクション (グローバル オブジェクトへのアクセスの取得など) が実行された場合に、エラーを防ぐか、エラーをスローします。
  • 混乱を招く機能やよく考えられていない機能を無効にします。

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

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

これは、古いコードと新しいコードを混在させる必要がある場合に役立つかもしれません ;-)

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

Strictモードになりました すべての主要なブラウザでサポートされています.

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

他のヒント

この新機能ECMAScript5.ジョン-Resigは、文書に 素敵概要 のです。

だから文字列に入れますのでごJavaScriptファイルは上部のファイル内の関数)のように見えること:

"use strict";

そのコードで今な問題を引き起こす現在のブラウザとしても文字列です。この問題コードの、将来にわたコードに反するpragma.例えば、現在の foo = "bar" 定義することなく、 foo 第一に、コードの始まりな---とができないと何もうまくいかないと思います。

声明 "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 strict モードでは、新しい変数は導入されません

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

  10. 名前のバインドまたは割り当てを禁止します eval そして arguments どのような形でも

  11. Strict モードでは、 arguments 仮パラメータを持つオブジェクト。(すなわち、で function sum (a,b) { return arguments[0] + b;} これが機能する理由は、 arguments[0] に縛られています a 等々。)

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

[参照: ストリクトモード, Mozilla 開発者ネットワーク]

人々はuse strictを使用して心配している場合は、この記事をチェックアウトする価値があるかもしれません。

ブラウザでECMAScriptの5「厳格モード」をサポート。これは何を意味するのでしょうか?
  の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.
*/

熱心に取り組んでいるプログラマーの皆さん、注意してください。申請中 "use strict" 既存のコードに変更すると危険になる可能性があります。これは、コードを「より良く」するためにコードに貼り付けることができる、気分が良く、幸せそうな顔のステッカーではありません。とともに "use strict" プラグマを使用すると、ブラウザーは、これまでスローしなかったランダムな場所で突然例外をスローします。その場所で、デフォルトまたは緩い JavaScript では喜んで許可されますが、厳格な JavaScript では嫌われるようなことを行っているからです。コード内でめったに使用されない呼び出しに厳密性違反が隠れており、最終的に実行される場合にのみ例外をスローする可能性があります。たとえば、有料顧客が使用する運用環境などです。

思い切って応募してみると良いでしょう "use strict" 包括的な単体テストと厳密に構成された JSHint ビルド タスクとともに、Strict モードをオンにしたという理由だけでモジュールにひどい爆発を引き起こすような暗い部分がないことをある程度確信できるようになります。あるいは、次のような別のオプションもあります。ただ追加しないでください "use strict" 正直なところ、従来のコードに置き換える場合、おそらくその方が安全です。 絶対にやめてください 追加 "use strict" サードパーティモジュールなど、あなたが所有または保守していないモジュールに対して。

たとえそれが檻に入れられた危険な動物であっても、 "use strict" それは良いことかもしれませんが、正しく行わなければなりません。厳格に取り組むのに最適な時期は、プロジェクトがグリーンフィールドで、ゼロからスタートするときです。構成、設定 JSHint/JSLint すべての警告とオプションをチームが耐えられる限り厳しく調整し、次のように調整された適切なビルド/テスト/アサート システムを時間内に取得します。 Grunt+Karma+Chai, その後、すべての新しいモジュールを次のようにマークし始めます。 "use strict". 。多くの厄介なエラーや警告を解決できるように準備してください。次の場合にビルドを FAIL に設定することで、全員が重力を理解できるようにします。 JSHint/JSLint 違反が発生します。

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

使用する 'use strict'; コードが突然改善されるわけではありません。

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

'use strict';

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

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

var a = 365;
var b = 030;

開発者は数値リテラルを並べるという強迫観念のあまり、うっかり変数を初期化してしまいました。 b 8 進リテラルを使用します。非厳密モードでは、これを値を持つ数値リテラルとして解釈します。 24 (10進数)。ただし、厳密モードではエラーがスローされます。

厳密モードの専門分野の完全なリストではありませんが、次を参照してください。 この答え.


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

  • 私の中で 新しい JavaScript アプリケーション: 絶対に! Strict モードは、コードで愚かなことをしている場合の内部告発として使用できます。

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


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

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

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

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

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

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

    中のすべて 語彙範囲 機能の doSomething 厳密モードで解釈されます。言葉 語彙範囲 ここで重要です。見る この答え より良い説明のために。


厳密モードではどのようなことが禁止されていますか?

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

範囲

歴史的に、JavaScript は はスコープが設定されています。静的にスコープが設定されているように見える場合もありますが、 機能により、動的にスコープが設定されているように動作します。これは 紛らわしく、プログラムを読みにくくし、理解しにくくします。誤解はバグの原因となります。それはパフォーマンス上の問題でもあります。静的スコープでは、コンパイル時に変数のバインドを行うことができます しかし、動的スコープの要件は、バインディングが ランタイムに据え置かれ、パフォーマンスが大幅に向上します 罰。

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

厳密なコードの利点の 1 つは、次のようなツールを使用できることです。 YUI コンプレッサー処理するときにより良い仕事をすることができます。

暗黙的なグローバル変数

JavaScript には暗黙のグローバル変数があります。もし 変数を明示的に宣言しない場合、グローバル変数は 暗黙的に宣言されます。これにより、プログラミングが簡単になります。 初心者は、基本的なハウスキーピングのいくつかを怠る可能性があるためです 家事。しかし、大規模なプログラムの管理ははるかに多くなります 難しく、信頼性を著しく低下させます。したがって、厳密には モードでは、暗黙のグローバル変数は作成されなくなります。あなたはすべきです すべての変数を明示的に宣言します。

グローバルリーク

原因となる可能性のある状況は数多くあります thisグローバル オブジェクトにバインドされます。たとえば、 提供します。 new 接頭辞をコンストラクタ関数を呼び出すと、 コンストラクタの this は予期せずグローバルオブジェクトにバインドされるため、 新しいオブジェクトを初期化する代わりに、 グローバル変数の改ざん。このような状況では、strict モードは 代わりにバインドします thisundefined, これにより、コンストラクタは 代わりに例外をスローして、エラーを多く検出できるようにします 一層。

ノイズの多い障害

JavaScript には常に読み取り専用プロパティがありますが、 ES5までは自分で作成できませんでした Object.createProperty関数はその能力を明らかにしました。値を割り当てようとした場合 読み取り専用プロパティにすると、暗黙のうちに失敗します。割り当ては プロパティの値は変更されませんが、プログラムは次のように処理されます。 あったのに。これは、プログラムに 不整合な状態になります。strict モードでは、 読み取り専用プロパティは例外をスローします。

8進数

数字の8進数(または8進数)表現は極端でした マシンレベルのプログラミングをマシンで行うときに便利です。 サイズは 3 の倍数でした。CDCで作業する際にはオクタルが必要でした 6600メインフレーム、ワードサイズは60ビット。あなたが読むことができたら 8 進数では、単語を 20 桁と見なすことができます。2 桁の数字を表す オペコードと 1 桁の数字は、8 つのレジスタのうちの 1 つを識別します。その間、 機械語から高級言語への移行は遅々として進まなかった プログラミング言語で 8 進数形式を提供するのに便利だと考えられています。

C言語では、八進性を非常に残念に表現したのが 入選:先頭のゼロ。したがって、Cでは、 0100 は 100 ではなく 64 を意味し、 08 は、 エラーではなく、8です。さらに残念なことに、この時代錯誤は JavaScriptを含むほぼすべての現代言語にコピーされています。 これは、エラーを作成するためにのみ使用されます。それ以外の目的はありません。だからで strict モードでは、8 進数形式は使用できなくなりました。

など

引数の擬似配列はもう少し多くなります ES5 では array-like です。厳密モードでは、その機能が失われます。 callee そして callerプロパティ。これにより、あなたの arguments untrusted に 多くの機密コンテキストをあきらめずにコーディングします。また、 arguments 関数の性質が排除されます。

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


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

ECMAScript 5 では予約語のリストが追加されています。これらを変数または引数として使用すると、厳密モードではエラーがスローされます。予約語は次のとおりです。

implements, interface, let, package, private, protected, public, static, 、 そして yield


参考文献

私は強く、今strictモードを使用して起動するすべての開発者をお勧めします。 strictモードが合法的に私たちもあなたのコードにあった知らなかったエラーから私たちを救うことになる、それを支える十分なブラウザがあります。

どうやら、初期の段階で、私たちは前に遭遇したことがないエラーが発生します。完全な利益を得るために、我々はすべてをキャッチしていることを確認するために、厳密なモードに切り替えた後、適切なテストを行う必要があります。確かに私達はちょうど私たちのコードでuse strictを投げると、エラーがないと仮定しないでください。だから、解約率は、それがより良いコードを書くために、この非常に便利な言語機能の使用を開始する時が来たということです。

たとえば、

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

JSLint には、ダグラス・クロックフォードによって書かれたデバッガです。単にあなたのスクリプトに貼り付け、それはすぐにあなたのコード内の任意の顕著な問題やエラーをスキャンします。

他の回答を補完する、もう少し根拠のある回答を提供したいと思います。最も人気のある回答を編集しようと思っていましたが、失敗しました。できる限り包括的かつ完全なものにするよう努めました。

を参照できます。 MDN ドキュメント 詳細については。

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

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

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

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

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

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

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

  • 厳密モードでコードを渡すとき、 eval(), 、呼び出し元のスコープ内で変数や関数を宣言または定義することはできません (通常モードでは可能です)。代わりに、新しいスコープが作成されます。 eval() 変数と関数はその範囲内にあります。そのスコープはその後破棄されます eval() 実行を終了します。
  • 厳密モードでは、関数の引数オブ​​ジェクトには、その関数に渡される値の静的コピーが含まれます。通常モードでは、arguments-object はいくぶん「魔法の」ような動作をします。配列の要素と名前付き関数のパラメーターは両方とも同じ値を参照します。
  • 厳密モードでは、 SyntaxError いつ delete 演算子の後には非修飾識別子 (変数、関数、または関数パラメーター) が続きます。通常モードでは、 delete 式は何も行わず、次のように評価されます。 false.
  • 厳密モードでは、 TypeError 構成不可能なプロパティを削除しようとしたとき。(通常モードでは、この試みは単純に失敗し、 delete 式は次のように評価されます false).
  • 厳密モードでは、オブジェクト リテラルに対して同じ名前を持つ複数のプロパティを定義しようとすると、構文エラーとみなされます。(通常モードではエラーは発生しません。)
  • 厳密モードでは、関数宣言に同じ名前の複数のパラメーターがある場合、構文エラーとみなされます。(通常モードではエラーは発生しません。)
  • 厳密モードでは、8 進数リテラルは許可されません (これらは で始まるリテラルです) 0x. 。(通常モードでは、一部の実装では 8 進リテラルが許可されます。)
  • 厳密モードでは、識別子は eval そして arguments キーワードのように扱われます。値を変更したり、値を代入したり、変数、関数、関数パラメータ、または catch ブロックの識別子の名前として使用したりすることはできません。
  • 厳密モードでは、呼び出しスタックを検査する可能性に対してより多くの制限があります。 arguments.caller そして arguments.callee 原因となる TypeError 厳密モードの関数内。さらに、厳密モードの関数の呼び出し元プロパティと引数プロパティによっては、 TypeError それらを読もうとすると。

の私の2セント:

strictモードの目標の一つは、問題のより迅速なデバッグを可能にすることです。これは、特定の間違ったことは、それはあなたのウェブページのサイレント&奇妙な行動を引き起こす可能性が発生したときに例外をスローすることによって、開発者を支援します。我々は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を実装すると、コードがエラーをスローします。

  

キャッチされないにReferenceError:nameoftreeが定義されていません。

サンプル

with文を排除します。

with文は uglify-jsからのようなツールを使用して縮小さすることはできません。彼らはまた、 に非推奨となり、将来のJavaScriptのバージョンからは削除している。

サンプル

の重複を防ぎます。

私たちは重複性質を持っている場合は、それが例外をスローします。

  

キャッチされないでSyntaxError:オブジェクト内の重複データプロパティリテラルではありません   strictモードでは許可されます。

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

があり、さらにいくつかのですが、私はその上でより多くの知識を得る必要があります。

あなたが最後の1年かそこらにリリースされ、ブラウザを使用している場合は、

それは最も可能性のJavaScript厳格なモードをサポートしています。唯一の古いブラウザでは周りのECMAScript 5の前にそれをサポートしていない現在の標準となりました。

コマンドの前後に引用符がstrictモードでは、構文エラーを生成し、物事は、一般的にちょうどそれらの古い方法を検出するために、いくつかのハードでは誤動作するスクリプトの原因となりますが、コードはまだ(および以前のバージョンのブラウザで動作することを確認してくださいブラウザ)。

追加する場合 "use strict";, 、次の場合は、 構文エラー スクリプトが実行される前に:

  • 将来の ECMAScript バージョンへの道を開く, 、新しく予約されたキーワードの 1 つを使用します ( ECMAScript 6): implements, interface, let, package, private, protected, public, static, 、 そして yield.

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

    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 つの引数を宣言する function

    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() { } 
    

出典:

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

  • JavaScriptのサイレントエラーを変更することで、いくつかのエラーを排除します エラーをスローします。

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

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

詳細については、こちらをご覧ください 厳密モード - JavaScript

「厳密を使用」;これは、プログラマーが JavaScript の不適切な特性を使用しないための保険です。定規が直線を引くのに役立つのと同じように、それはガイドです。「Use Strict」は「ストレートなコーディング」を行うのに役立ちます。

線をまっすぐにするために定規を使用したくない人は、通常、他の人にコードのデバッグを求めるページに行き着きます。

私を信じて。オーバーヘッドは、適切に設計されていないコードに比べて無視できます。 数年間シニア JavaScript 開発者を務めている Doug Crockford が、ここに非常に興味深い投稿を投稿しています。. 。個人的には、自分の良い習慣を忘れないようにするために、常に彼のサイトにアクセスするのが好きです。

最新の JavaScript の実践では、常に「Use Strict」を呼び起こす必要があります。プラグマ。 ECMA グループが「Strict」モードをオプションにした唯一の理由 経験の浅いプログラマーに JavaScript へのアクセスを許可し、新しく安全なコーディング手法に適応する時間を与えることです。

この時点から、あなたのすべての機密JavaScriptファイルの先頭でuse strict含め、より良いJavaScriptのプログラマであるとグローバルになってきてランダムな変数を避けるための小さな方法であり、物事は静かに変化します。

W3Schoolsのからの引用をます:

  

"を使用し、厳密な" 指令

     

「を使用し、厳格な」ディレクティブでは、JavaScript 1.8.5(ECMAScriptので新たに追加されました   バージョン5)。

     

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

     

「厳格な使用」の目的は、コードがなければならないことを示すためであります   "strictモード" で実行します。

     

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

     

なぜ厳格なモード?

     

厳格モードは、簡単に書くJavaScriptを "確保" することができます。

     

厳密モードの変更は、以前に実際のエラーに「不正な構文」を受け入れます。

     

は、一例として、通常のJavaScriptで、変数名をタイプミスして作成します   新しいグローバル変数。 strictモードでは、これはエラーをスローします、   それが不可能な偶然グローバル変数を作成すること。

     

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

     

厳密モードにおいて、非書き込み可能なプロパティへの割り当て、   ゲッターのみのプロパティ、非既存のプロパティ、存在しません   変数、または存在しないオブジェクトは、エラーがスローされます。

http://www.w3schools.com/js/js_strict.asp

の詳細を知るために

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

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

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

MDN の次のステートメントと例を見てください。

「use strict」ディレクティブ
"use strict" ディレクティブは、 JavaScript 1.8.5 (ECMAScript バージョン 5)。これはステートメントではなく、 リテラル式で、以前のバージョンの JavaScript では無視されていました。ザ 「use strict」の目的は、コードが 「厳格モード」で実行されます。strict モードでは、たとえば、 宣言されていない変数を使用します。

「厳密な使用」の使用例:
関数の厳密モード:同様に、 関数、正確なステートメント "use strict"を置きます。(または '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 で詳細を読む.

のECMAScript委員会にいた何人かの人々によって、良い話があります:のJavaScriptへの変更は、パート1 :。"use strict"スイッチをどのように増分使用についてのECMAScript 5" はJavaScriptの実装者が突然、世界のすべてのウェブサイトを壊すことなくJavaScriptを危険な機能の多くをクリーンアップすることができます。

もちろん、それはまた、これらのmisfeaturesの多くは(た)されている程度だけで何話すとどのようにECMAScriptの5は、それらを修正します。

比較する小型の例:

非strictモード:

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

非strictモード:

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

ご了承ください use strict で紹介されました Ecmaスクリプト5 そしてそれ以来保管されていました。

以下はストリクトモードをトリガーする条件です。 ES6 そして ES7:

  • グローバル コードは、Use Strict ディレクティブ (14.1.1 を参照) を含むディレクティブ プロローグで始まる場合、ストリクト モード コードです。
  • モジュール コードは常に厳密モード コードです。
  • のすべての部分 クラス宣言 または クラス式 厳密モードコードです。
  • Eval コードが Use Strict ディレクティブを含むディレクティブ プロローグで始まる場合、または eval の呼び出しが strict モード コードに含まれる直接 eval (12.3.4.1 を参照) である場合、eval コードは strict モード コードです。
  • ファンクション コードは、関連付けられている場合は厳密モード コードです。 FunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、MethodDefinition、または ArrowFunction が厳密モード コードに含まれているか、関数の [[ECMAScriptCode]] 内部スロットの値を生成するコードが Use Strict ディレクティブを含むディレクティブ プロローグで始まる場合。
  • 組み込み Function および Generator コンストラクターへの引数として指定される関数コードは、最後の引数が String であり、処理時に 機能本体 これは、Use Strict ディレクティブを含むディレクティブ プロローグで始まります。

開発者が使用すべき主な理由 "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. 変数としてのキーワードの使用を制限します。それらを使用しようとするとエラーがスローされます。

つまり、コードにエラーが発生しにくくなり、結果として良いコードを書くことができるようになります。

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

「厳格な使用」。 JavaScriptを少しより堅牢にするECMAの努力があります。これは、JSでそれが少なくとも少し「厳しい」(他の言語は90年代以来、厳格なルールを実装)を作成しようとする試みをもたらします。それは実際には「力」JavaScript開発者は、コーディングのベストプラクティスのいくつかの並べ替えを追跡します。 それでも、JavaScriptは非常に壊れやすいです。などの型の変数、型指定された方法、のようなものはありません 私は強く、それが良い仕事とデバッグが容易になります、JavaやActionScript3など、より堅牢な言語を学ぶ、およびJavaScriptコードで同じベストプラクティスを実装するためにJavaScript開発者をお勧めします。

JavaScript の「strict」モードは ECMAScript 5 で導入されました。

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

書き込み "use strict"; JSファイルの一番上で、厳密な 構文チェック。次のタスクを実行します。

  1. 宣言されていない変数に代入しようとするとエラーが表示されます

  2. 主要な JS システム ライブラリを上書きしないようにします

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

use strict 個々の関数内でも動作します。常に含めることをお勧めします。 use strict あなたのコードに。

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

use strictはあなたが、それはコードをより厳密に行う前writedたようexpect.Andとして働くことができない危険な機能を使用することはできません。原因、あなたのコードをより安全にする方法がある。

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

  • 偶発的なグローバルの防止

  • 重複はありません

  • で消去します

  • この強制を排除します

  • より安全な eval()

  • 不変のエラー

これも読むことができます 記事 詳細については

通常、JavaScriptは、したがってエラーの可能性を増加させる、厳格なルールに従いません。 "use strict"を使用した後、JavaScriptコードは、そのようなターミネーターの使用のような他のプログラミング言語のようなルールの厳密なセットに従うべきである、初期化の前に宣言、等

"use strict"を使用する場合は、

、コードは、従ってエラーや曖昧さの可能性を減少させる、ルールの厳密なセットに従うことによって書かれるべきである。

"厳密な使用";JavaScript コードが "strict mode"です。

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

最新のブラウザはすべて「use strict」をサポートしています。 Internet Explorer 9 以前.

不利益

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

さらに悪いことに、開発者は通常モードにあるため、追加のエラーがスローされるという利点がなく、エラーが通知されずに失敗する可能性があります。

また、上に示したように、厳密モードでは特定の操作が禁止されます。

一般に、そもそもそのようなものを使用すべきではないと考えられていますが、開発者の中にはその制約を好まず、言語のすべての機能を使用したいと考える人もいます。

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

非strictモードで書かれた下の機能を確認してください。

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

この機能では、関数内nameという変数を使用しています。その特定の関数スコープでその特定の名前で宣言された任意の変数がある場合は内部的には、コンパイラが最初にチェックします。コンパイラは、そのような変数が存在しないことを理解ので、外側のスコープでチェックします。我々の場合には、それがグローバルスコープです。ここでも、コンパイラは、そこにもその名前のグローバル空間に宣言された変数ではないので、それはグローバルな空間に私たちのために、このような変数を作成することを理解しました。概念的には、この変数はグローバルスコープで作成され、アプリケーション全体で利用できるようになります。

別のシナリオは、たとえば、変数は子関数で宣言されている、ということです。その場合には、コンパイラは、外側の範囲、即ち、親関数内のその変数の有効性をチェックします。唯一のそれはグローバル空間にチェックし、そこに私たちのための変数を作成します。 それは追加のチェックが行われる必要があることを意味します。これは、アプリケーションのパフォーマンスに影響します。

<時間>

今度は、strictモードで同じ機能を書いてみましょう。

"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モードでは、コンパイラは、私たちはそれを宣言せずに変数を使用することはできません。だから、メモリリークを防止することができます。また、我々はより多くの最適化されたコードを書くことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top