javascript - 関数 - node.js style guide




JavaScriptで「厳密に使用する」とは何ですか?その背後にある理由は何ですか? (17)

最近、私はJavaScriptコードの一部をCrockfordのJSLintで実行しましたが、次のエラーが発生しました:

1行目の問題文字1: "厳格な"文がありません。

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

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

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


'use strict'; 突然コードを良くすることはありません。

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

'use strict';

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

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

var a = 365;
var b = 030;

彼らは、数値リテラルを整理するために、変数bを8進リテラルで不注意に初期化しています。 厳密でないモードでは、数値24 (10進数)の数値リテラルとして解釈されます。 ただし、strictモードではエラーが発生します。

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

どこで'use strict';使用'use strict';べきですか? ?

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

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

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

  1. 'use strict';挿入し'use strict'; あなたのスクリプトの上の文:

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

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

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

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

    関数のレキシカルスコープ内のすべてのものは、厳密なモードで解釈されます。 単語の語彙範囲はここで重要です。 より良い説明については、 この回答を参照してください。

厳格なモードで禁止されているものは何ですか?

私は厳密なモードで禁止されているいくつかのことを記述した素敵な記事を見つけました(これは排他的なリストではありません)。

範囲

歴史的に、JavaScriptは関数のスコープの仕方について混乱していました。 場合によっては静的スコープに見える場合もありますが、動的スコープのように動作する機能もあります。 これは混乱し、プログラムの読み込みや理解が難しくなります。 誤解はバグを引き起こす。 また、パフォーマンス上の問題です。 静的スコープを使用すると、コンパイル時に変数バインディングが発生する可能性がありますが、動的スコープの要件は、実行時にバインドを延期しなければならないことを意味します。

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

厳密なコードのメリットの1つは、 YUI Compressorのようなツールは、処理するときにより良い仕事をすることができるということです。

暗黙のグローバル変数

JavaScriptにはグローバル変数が含まれています。 変数を明示的に宣言しないと、グローバル変数が暗黙的に宣言されます。 これは、基本的なハウスキーピング作業の一部を怠る可能性があるため、初心者にとってプログラミングを容易にします。 しかし、それは大規模なプログラムの管理をはるかに困難にし、信頼性を大幅に低下させます。 厳密なモードでは、暗黙のグローバル変数はもはや作成されません。 すべての変数を明示的に宣言する必要があります。

グローバルリーク

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

騒々しい失敗

JavaScriptには常に読み取り専用のプロパティがありますが、ES5のObject.createProperty関数がその機能を公開するまで、JavaScriptを独自に作成することはできませんでした。 読み取り専用プロパティーに値を代入しようとすると、暗黙的に失敗します。 この割り当てはプロパティの値を変更することはありませんが、あなたのプログラムはそれが持っていたかのように進んでいきます。 これは、プログラムが矛盾した状態になる可能性のある完全性の危険です。 strictモードでは、読み取り専用プロパティを変更しようとすると例外がスローされます。

オクタル

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

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

その他

引数の擬似配列は、ES5では配列のようになります。 strictモードでは、 calleecallerプロパティが失われます。 これにより、多くの機密コンテキストを諦めることなく、信頼できないコードにargumentsを渡すことが可能になります。 また、関数のargumentsプロパティも削除されています。

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

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

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

implementsinterfaceletpackageprivateprotectedpublicstaticyield

参考文献


"厳密な使用"; プログラマがJavaScriptのゆるいプロパティや悪いプロパティを使用しないという保険です。 それは、あなたが直線を作るのを手助けするようなガイドです。 「Strictを使用する」は、「ストレートコーディング」を行うのに役立ちます。

ルーラーを使用して直線を直線的に使用したくない人は、通常、他の人がコードをデバッグするよう求めているページで終わります。

私を信じてください。オーバーヘッドは、設計が不適切なコードと比較して無視できる程度です。数年前からシニアJavaScript開発者として活躍していたDoug Crockford氏は、ここでは非常に興味深い投稿をしています。個人的には、自分のサイトにいつも戻って、自分の良い習慣を忘れないようにしたい。

現代のJavaScriptの習慣は、常に「厳密な使用」を呼び起こすべきです。プラグマ。ECMA Groupが「厳格」モードをオプションにした唯一の理由は、経験の少ないコーダーにJavaScriptへのアクセスを許可し、新しい安全なコーディング手法に適応する時間を与えることです。


Javascript Strict Modeについてのこの記事では、 John Resig - ECMAScript 5 Strict Mode、JSON、その他

興味深い部分を引用するには:

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

そして:

Strictモードはいくつかの点で役立ちます:

  • 例外を投げながら、いくつかの一般的なコーディング・グロッパーを捕まえます。
  • 比較的安全でないアクション(グローバルオブジェクトへのアクセス権の獲得など)が行われた場合、エラーを防止したり、エラーをスローしたりします。
  • それは、混乱しているか、または慎重に考えられていない機能を無効にします。

また、ファイル全体に "厳密モード"を適用することもできます...または、特定の機能(それは依然としてJohn Resigの記事から引用していますに対してのみ使用できます。

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

古いコードと新しいコードを混ぜなければならない場合に役立つかもしれません;-)

ですから、Perlで使うことができる"use strict"思います破損する可能性のあるものをさらに検出することで、エラーを減らすことができます)。

現在、 すべての主要なブラウザ (IE 9以下)で サポートされています


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

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

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

  • ECMAScriptの将来のバージョンで定義される可能性のある構文が禁止されています。

詳細はこちらvistit 厳密なモード - Javascript


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

  • 新たに予約されたキーワード( ECMAScript 6の暫定 )の1つを使用して、 将来のECMAScriptバージョンへの道を拓いてくださいimplementsinterfaceletpackageprivateprotectedpublicstaticyield

  • ブロック内での関数の宣言

    if(a<b){ function f(){} }
    
  • オクタル構文

    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 myVariable;を使用deleteと、 delete myVariable; deleteれますdelete myVariable;

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

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

ソース:


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

また厳密なモードでは、物事はより速く実行され、いくつかの警告や静かな警告は致命的なエラーを投げます。

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

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

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

"use strict"の使用例:
関数の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についてもっと読むことができます


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.
*/

私の2セント:

strictモードの目的の1つは、問題の高速デバッグを可能にすることです。 これは、Webページの静かで奇妙な動作を引き起こす可能性のある間違ったことが起こったときに例外をスローすることによって開発者を助ける。 use 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);

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

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

Sample

声明文を削除with

with文はuglify-jsようなツールを使って縮小することはできません。 これらはdeprecatedあり、将来のJavaScriptバージョンからも削除されています。

Sample

重複を防ぐ:

重複したプロパティを持つと、例外がスローされます

Uncaught SyntaxError:厳密なモードでオブジェクトリテラルのデータプロパティが重複しない

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

それ以上のことはありますが、私はそれについてもっと知識を得る必要があります。


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

  • 偶発的なグローバルを防ぐ

  • 重複はありません

  • 排除する

  • この強制を排除する

  • より安全なeval()

  • immutablesのエラー

詳細はこのarticleを読むこともできます


これは、ECMAScript 5の新機能です。John Resig氏は、 その素晴らしい要約を書いています。

これは、あなたのJavaScriptファイル(ファイルの先頭または関数の中のいずれか)に次のように記述した文字列です。

"use strict";

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


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

機能一覧(非網羅的)

  1. グローバル変数を許可しません。 (変数名に変数宣言とタイプミスがあるのをキャッチします)

  2. サイレント失敗の割り当ては、strictモードでエラーをスローします( NaN = 5;代入しNaN = 5; )。

  3. 削除不能なプロパティを削除しようとすると、Object.prototypeを削除します。

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

  5. 関数のパラメータ名は一意でなければなりません( function sum (x, x) {...}

  6. 8進数の構文を禁止します( var x = 023;先行するゼロが数値を変更することを何もしないと間違っている開発者もいます)。

  7. withキーワードを禁止する

  8. strictモードのevalは新しい変数を導入しない

  9. 平凡な名前を削除することを禁じる( delete x;

  10. 任意の形式のevalargumentsの名前のバインドまたは割り当てを禁止します。

  11. 厳密モードは、仮argumentsオブジェクトのプロパティのエイリアスを行いません。 (つまり、 function sum (a,b) { return arguments[0] + b;}これはarguments[0]aなどに束縛されてaために機能します)。

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

[参照: StrictモードMozilla Developer Network ]


他の答えを補完するために、もう少し基礎的な答えを提供したいと思います。 私は最も人気のある答えを編集することを望んでいたが、失敗した。 私はできる限り包括的かつ完全なものにしようとしました。

詳細については、 MDNのマニュアルを参照してください。

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

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

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

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

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

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

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

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

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

コマンドの引用符は、厳密なモードで構文エラーを生成するものは一般的に、古いブラウザーでは検出が困難な一部のスクリプトで誤動作させますが、古いブラウザーでもコードは引き続き使用できることを確認しています。


比較する小さな例:

非厳密モード:

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

ECMAScript委員会に参加していた人たちの話があります。「JavaScriptの変更、第1部:ECMAScript 5」"use strict"では、スイッチを増分的に使用することで、JavaScriptの危険な機能の多くを、世界中。

もちろん、これらの誤った機能が何であるか、そしてECMAScript 5がそれらをどのように修正するかについても言及しています。


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


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

要するに、コードのエラーを起こしにくく、順番に良いコードを書くようになります。

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





use-strict