サーチ…


構文

  • 'use strict';
  • "厳密に使う";
  • `use strict`;

備考

Strictモードは、ECMAScript 5でいくつかの後方互換性のない拡張を可能にするために追加されたオプションです。 「厳密モード」コードの動作の変更には、次のものがあります。

  • 未定義の変数に代入すると、新しいグローバル変数を定義する代わりにエラーが発生します。
  • 書き込み不能なプロパティ( window.undefinedなど)に割り当てたり削除したりすると、サイレント実行ではなくエラーが発生します。
  • レガシオクタル構文(例: 0777 )はサポートされていません。
  • with文はサポートされていません。
  • evalは周囲のスコープに変数を作成することはできません。
  • 関数の.callerプロパティと.argumentsプロパティはサポートされていません。
  • 関数のパラメータリストには重複はありません。
  • windowは自動的にthis値として使用されなくなりました。

: - 厳密でないモードの機能に依存するJavaScriptをページが使用している場合、そのコードが壊れるように、 ' strict 'モードはデフォルトでは有効になっていません。したがって、それはプログラマ自身によってオンにされなければならない。

スクリプト全体

Strictモードは、ステートメント"use strict";置くことでスクリプト全体に適用できます"use strict";他の声明の前に。

"use strict";
// strict mode now applies for the rest of the script

Strictモードは、 "use strict"を定義するスクリプトでのみ有効になります。厳密な状態は異なるスクリプト間で共有されないため、厳密なモードの有無にかかわらずスクリプトを組み合わせることができます。

6

注意: ES2015 + モジュールおよびクラス内で書かれたすべてのコードは、デフォルトで厳密です。

関数の場合

Strictモードは、 "use strict";前置することによって単一の関数に適用することもでき"use strict";関数宣言の冒頭にある文。

function strict() {
   "use strict";
   // strict mode now applies to the rest of this function
   var innerFunction = function () {
     // strict mode also applies here
   };
}

function notStrict() {
  // but not here
}

厳密なモードは、スコープ内の任意の関数にも適用されます。

グローバルプロパティへの変更

非strictモードのスコープでは、変数がvarconstまたはletキーワードで初期化されずに割り当てられると、自動的にグローバルスコープで宣言されます。

a = 12;
console.log(a); // 12

ただし、厳密なモードでは、宣言されていない変数へのアクセスは参照エラーをスローします。

"use strict";
a = 12; // ReferenceError: a is not defined
console.log(a);

これは、JavaScriptが予期しない可能性のあるいくつかのイベントを持っているので便利です。厳密ではないモードでは、これらのイベントにより、開発者はバグや予期しない動作であると信じることが多いため、厳格モードを有効にすることにより、スローされたエラーによって何が行われているのかを正確に知るよう強制されます。


"use strict";
                       // Assuming a global variable mistypedVariable exists
mistypedVaraible = 17; // this line throws a ReferenceError due to the 
                       // misspelling of variable

厳密なモードのこのコードは、1つの可能なシナリオを表示します。つまり、割り当ての行番号を指す参照エラーがスローされ、開発者は変数名のミスタイプをすぐに検出できます。

非strictモードでは、エラーがスローmistypedVaraible 、割り当てが正常に行われたことに加えて、 mistypedVaraibleはグローバル変数としてグローバルスコープ内で自動的に宣言されます。これは、コード内のこの特定の割り当てを開発者が手作業で調べる必要があることを意味します。


さらに、変数の宣言を強制することで、開発者は誤ってグローバル変数を関数内で宣言することはできません。非厳密モードでは:

function foo() { 
   a = "bar"; // variable is automatically declared in the global scope
}
foo();
console.log(a); // >> bar

strictモードでは、変数を明示的に宣言する必要があります。

function strict_scope() { 
   "use strict";
   var a = "bar"; // variable is local
}
strict_scope();
console.log(a); // >> "ReferenceError: a is not defined"

変数は、関数の外側と後に宣言することもできます。たとえば、グローバルスコープで使用することができます。

function strict_scope() { 
   "use strict";
   a = "bar"; // variable is global
}
var a;
strict_scope();
console.log(a); // >> bar

プロパティの変更

Strictモードでは、削除不能なプロパティを削除することもできません。

"use strict";
delete Object.prototype; // throws a TypeError

厳密なモードを使用しない場合、上記のステートメントは無視されますが、なぜそれが期待どおりに実行されないのかがわかります。

また、非拡張可能なプロパティを拡張することもできません。

var myObject = {name: "My Name"}
Object.preventExtensions(myObject);

function setAge() {
    myObject.age = 25;   // No errors
}

function setAge() {
    "use strict";
    myObject.age = 25;  // TypeError: can't define property "age": Object is not extensible
}

関数の引数リストの振る舞い

argumentsオブジェクトは、 厳密および非厳密モードでは異なる動作をします。 非厳密モードでは、 argumentオブジェクトは存在するパラメータの値の変化を反映しますが、 厳密モードではパラメータの値の変更はargumentオブジェクトに反映されません。

function add(a, b){
    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 5,10
}

add(1, 2);

上記のコードでは、 argumentsオブジェクトはパラメータの値を変更すると変更されます。ただし、 厳密モードの場合は、同じことが反映されません。

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 1,2
}

いずれかのパラメータがundefinedであり、 厳密モードまたは非厳密モードの両方でパラメータの値を変更しようとすると、 argumentsオブジェクトは変更されません。

厳密モード

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // undefined,undefined 
                                             // 1,undefined
    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // undefined,undefined
                                             // 1, undefined
}
add();
// undefined,undefined 
// undefined,undefined

add(1)
// 1, undefined
// 1, undefined

非厳密モード

function add(a,b) {

    console.log(arguments[0],arguments[1]);

    a = 5, b = 10;

    console.log(arguments[0],arguments[1]);
}
add();
// undefined,undefined 
// undefined,undefined

add(1);
// 1, undefined
// 5, undefined

重複するパラメータ

Strictモードでは、重複した関数のパラメータ名を使用することはできません。

function foo(bar, bar) {}  // No error. bar is set to the final argument when called

"use strict";
function foo(bar, bar) {}; // SyntaxError: duplicate formal argument bar

strictモードでの関数スコープ

厳密モードでは、ローカルブロック内で宣言された関数はブロック外ではアクセスできません。

"use strict";
{
  f(); // 'hi'
  function f() {console.log('hi');}
}
f(); // ReferenceError: f is not defined

Scope-wise、Strict Modeの関数宣言は、 letconstと同じ種類のバインディングを持っています。

単純でないパラメータリスト

function a(x = 5) {
  "use strict";
}

上記のような非単純なパラメータリストを持つ関数でディレクティブ"use strict""use strict"することができないため、JavaScriptが無効でSyntaxErrorをスローします - デフォルト割り当てx = 5

非単純なパラメータには、

  • デフォルト割り当て先
function a(x = 1) {
  "use strict";
}
  • 破壊
function a({ x }) {
  "use strict";
}
  • 残りパラメータ
function a(...args) {
  "use strict";
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow