最近、私はCrockfordの JSLint を通して私のJavaScriptコードの一部を実行しました、そしてそれは以下のエラーを与えました:
1行目の文字1に問題があります。 "use strict"ステートメントがありません。
検索をしているうちに、JavaScriptコードに"use strict";
を追加する人がいることに気づきました。文を追加すると、エラーは表示されなくなりました。残念なことに、Googleはこの文字列ステートメントの背後にある歴史の多くを明らかにしていません。確かにそれはJavaScriptがブラウザによってどう解釈されるかと関係があるに違いないが、私はその効果がどうなるか見当がつかない。
では、"use strict";
とは何ですか、それは何を意味するのでしょうか。
現在のブラウザのどれかが"use strict";
文字列に応答しますか、それとも将来の使用のためですか?
Javascript Strict Modeに関するこの記事は、興味を引くかもしれません: John Resig-ECMAScript 5 Strict Mode、JSONなど
興味深い部分を引用するには:
厳密モードはECMAScript 5の新機能で、プログラムまたは関数を「厳密な」操作コンテキストに配置できます。この厳密なコンテキストにより、特定のアクションが実行されなくなり、より多くの例外がスローされます。
そして:
厳密モードは、いくつかの方法で役立ちます。
- いくつかの一般的なコーディングブロッパをキャッチし、例外をスローします。
- 比較的「安全でない」アクション(グローバルオブジェクトへのアクセスの取得など)が実行されたときに、エラーを防止またはスローします。
- 混乱したり、よく考えられていない機能を無効にします。
また、ファイル全体に「厳格モード」を適用できることに注意してください...または、特定の機能にのみ使用できます(John Resigの記事から引用):
// Non-strict code... (function(){ "use strict"; // Define your library strictly... })(); // Non-strict code...
古いコードと新しいコードを混在させる必要がある場合に役立つかもしれません;-)
ですから、Perlで使用できる"use strict"
に少し似ていると思います(名前は?):エラーを少なくするのに役立ちます、破損につながる可能性のあるものをさらに検出します。
厳格モードは現在、 すべての主要なブラウザでサポートされています です。
ネイティブECMAScriptモジュール (import
およびexport
ステートメントを使用)および ES6クラス の内部では、厳密モードは常に有効であり、無効にすることはできません。
これはECMAScript 5の新機能です。JohnResigが Niceのまとめ を書きました。
これは、JavaScriptファイルに(ファイルの先頭または関数の内部に)入れた単なる文字列です。
"use strict";
それを単なる文字列なので、今すぐあなたのコードに入れても、現在のブラウザでは問題にならないはずです。コードがプラグマに違反すると、将来コードに問題が生じる可能性があります。例えば、あなたが現在foo
を定義せずに現在foo = "bar"
を持っているなら、あなたのコードは失敗し始めるでしょう...これは私の意見では良いことです。
ステートメント"use strict";
は、厳密モードを使用するようにブラウザーに指示します。これは、JavaScriptの縮小されたより安全な機能セットです。
グローバル変数を許可しません。 (変数名にvar
宣言とタイプミスがないことをキャッチ)
サイレントな失敗した代入はstrictモードでエラーを投げます(NaN = 5;
の代入)
削除できないプロパティを削除しようとするとスローされます(delete Object.prototype
)
オブジェクトリテラル内のすべてのプロパティ名を一意にする必要があります(var x = {x1: "1", x1: "2"}
)
関数パラメータ名は一意である必要があります(function sum (x, x) {...}
)
8進構文を禁止します(var x = 023;
一部の開発者は、先行するゼロは数値を変更するものではないと誤って想定しています)。
with
キーワードを禁止します
厳密モードでのeval
は新しい変数を導入しません
プレーンネームの削除を禁止します(delete x;
)
eval
とarguments
という名前の束縛または代入をいかなる形式でも禁止します
厳密モードでは、arguments
オブジェクトのプロパティを仮パラメータでエイリアスすることはありません。 (つまりfunction sum (a,b) { return arguments[0] + b;}
の場合これは、arguments[0]
がa
にバインドされているためなどに機能します。)
arguments.callee
はサポートされていません
[参照: 厳密モード 、 Mozilla Developer Network ]
人々が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ビルドタスクと共に適用することをお勧めします。厳密モードをオンにしたからといって恐ろしくアップします。または、もう1つのオプションがあります。レガシーコードに"use strict"
を追加しないでください。正直なところ、おそらくこの方法の方が安全です。 DEFINITELY DO NOTサードパーティのモジュールのように、所有または保守していないモジュールに"use strict"
を追加します。
ケージに入れられた致命的な動物であるにもかかわらず、"use strict"
は良いものになる可能性がありますが、あなたはそれを正しくしなければなりません。厳しくするのに最適なのは、プロジェクトが未開拓地で、ゼロから始めるときです。 JSHint/JSLint
を設定し、チームが耐えられる限りのすべての警告とオプションをきつく締め、Grunt+Karma+Chai
のように装備された適切なビルド/テスト/アサートシステムを取得します。 "use strict"
として。たくさんのひどいエラーや警告を治す準備をしてください。 JSHint/JSLint
で違反が発生した場合、ビルドをFAILに設定して、全員が重力を理解していることを確認してください。
"use strict"
を採用したとき、私のプロジェクトはグリーンフィールドプロジェクトではありませんでした。その結果、私のモジュールの半分に"use strict"
がないため、IDEは赤いマークでいっぱいになり、JSHintはそれについて文句を言います。これは、今後リファクタリングを行う必要があることを思い出させてくれます。私の目標は、不足している"use strict"
ステートメントがすべてあるため、レッドマークをなくすことですが、それは数年先です。
'use strict';
を使用しても、突然コードが改善されるわけではありません。JavaScript strictモード は ECMAScript 5 の機能です。スクリプト/関数の上部でこれを宣言することにより、厳格モードを有効にできます。
'use strict';
JavaScriptエンジンは、このディレクティブを検出すると、特別なモードでコードの解釈を開始します。このモードでは、潜在的なバグになる可能性のある特定のコーディング手法が検出されたときにエラーがスローされます(これがストリクトモードの背後にある理由です)。
この例を考えてみましょう:
var a = 365;
var b = 030;
開発者は、数値リテラルを揃えるという強迫観念の中で、変数b
を8進リテラルで誤って初期化してしまいました。非厳密モードは、これを値24
(10進数)の数値リテラルとして解釈します。ただし、厳格モードではエラーがスローされます。
ストリクトモードの専門分野の完全なリストについては、 this answer を参照してください。
'use strict';
はどこで使用すればよいですか?私のnewJavaScriptアプリケーションでは:Absolutely!Strictモードは内部で内部告発者として使用できますあなたのコードに愚かな何か。
existingJavaScriptコード:おそらくない!既存のJavaScriptコードに厳格モードでは、アプリケーションは単純に中断します。ストリクトモードが必要な場合は、既存のコードをデバッグおよび修正する準備をする必要があります。これが、'use strict';
を使用してもコードが突然改善されるわけではない理由です。
スクリプトの上に'use strict';
ステートメントを挿入します。
// File: myscript.js
'use strict';
var a = 2;
....
ファイルmyscript.js
内のすべてが厳密モードで解釈されることに注意してください。
または、関数本体の上に'use strict';
ステートメントを挿入します。
function doSomething() {
'use strict';
...
}
関数doSomething
のlexical scope内のすべては、strictモードで解釈されます。ここでは、Wordlexical scopeが重要です。より良い説明については this answer をご覧ください。
素敵な記事 strictモードで禁止されているいくつかのことを説明していることがわかりました(これは排他的なリストではないことに注意してください):
範囲
歴史的に、JavaScriptは関数のスコープについて混乱しています。静的にスコープされているように見えることもありますが、一部の機能により、動的にスコープされているように動作します。これは混乱を招き、プログラムを読みやすく理解しにくくします。誤解はバグを引き起こします。また、パフォーマンスの問題でもあります。静的スコープはコンパイル時に変数バインディングを許可しますが、動的スコープの要件はバインディングを実行時まで延期する必要があることを意味し、これにはパフォーマンス上の重大なペナルティが伴います。
厳密モードでは、すべての変数バインドが静的に実行される必要があります。つまり、以前は動的バインドを必要としていた機能を削除または変更する必要があります。具体的には、withステートメントが削除され、eval関数の呼び出し元の環境を改ざんする機能が厳しく制限されています。
厳密なコードの利点の1つは、 YUI Compressor などのツールが処理時により良い仕事をすることができることです。
暗黙のグローバル変数
JavaScriptにはグローバル変数が含まれています。変数を明示的に宣言しない場合、グローバル変数が暗黙的に宣言されます。これにより、初心者は基本的なハウスキーピング作業のいくつかを無視できるため、プログラミングが容易になります。ただし、大規模なプログラムの管理がはるかに難しくなり、信頼性が大幅に低下します。したがって、strictモードでは、暗黙のグローバル変数は作成されなくなりました。すべての変数を明示的に宣言する必要があります。
グローバルリーク
this
がグローバルオブジェクトにバインドされる原因となる多くの状況があります。たとえば、コンストラクター関数を呼び出すときにnew
プレフィックスを指定するのを忘れると、コンストラクターのthis
が予期せずグローバルオブジェクトにバインドされるため、新しいオブジェクトを初期化する代わりに、サイレントにグローバル変数を改ざんします。これらの状況では、代わりにストリクトモードがthis
をundefined
にバインドします。これにより、コンストラクターが代わりに例外をスローし、エラーをより早く検出できます。ノイズの多い障害
JavaScriptには常に読み取り専用のプロパティがありますが、ES5の
Object.createProperty
関数がその機能を公開するまで、自分で作成することはできません。読み取り専用プロパティに値を割り当てようとすると、サイレントに失敗します。割り当てによってプロパティの値は変更されませんが、プログラムはあたかもそれがあったかのように進みます。これは、プログラムが矛盾した状態になる可能性がある整合性の危険です。厳格モードでは、読み取り専用プロパティを変更しようとすると、例外がスローされます。オクタル
Wordのサイズが3の倍数であるマシンでマシンレベルのプログラミングを行う場合、8進数(または8進数)表現は非常に便利でした。 8進数を読むことができれば、Wordを20桁で見ることができます。 2桁がオペコードを表し、1桁が8つのレジスタの1つを識別しました。マシンコードから高レベル言語へのゆっくりとした移行の際、プログラミング言語で8進数形式を提供することが有用であると考えられていました。
Cでは、非常に残念な8進数の表現が選択されました:先行ゼロ。 Cでは、
0100
は100ではなく64を意味し、08
は8ではなくエラーを意味します。さらに残念なことに、この時代錯誤はJavaScriptを含むほぼすべての現代言語にコピーされています。エラーを作成するために使用されます。他の目的はありません。したがって、strictモードでは、8進数形式は許可されなくなりました。等
引数の擬似配列は、ES5ではもう少し配列のようになります。厳格モードでは、
callee
およびcaller
プロパティが失われます。これにより、多くの機密コンテキストをあきらめることなく、arguments
を信頼できないコードに渡すことができます。また、関数のarguments
プロパティは削除されました。厳格モードでは、関数リテラルの重複キーは構文エラーを生成します。関数に同じ名前の2つのパラメーターを含めることはできません。関数は、そのパラメーターの1つと同じ名前の変数を持つことはできません。関数は、それ自身の変数を
delete
できません。設定できないプロパティをdelete
にしようとすると、例外がスローされるようになりました。プリミティブ値は暗黙的にラップされません。
ECMAScript 5は予約語のリストを追加します。これらを変数または引数として使用すると、strictモードはエラーをスローします。予約語は次のとおりです。
implements
、interface
、let
、package
、private
、protected
、public
、static
、およびyield
すべての開発者に今すぐstrictモードを使い始めることを強くお勧めします。それをサポートしているブラウザは十分にありますが、strictモードは合法的にあなたのコードにあることさえ知らなかったエラーから私たちを救うのに役立つでしょう.
どうやら、初期段階で私たちが今まで遭遇したことがないエラーがあるでしょう。最大限の利益を得るためには、strictモードに切り替えた後に適切なテストを行う必要があります。もちろん、コードにuse strict
をスローするだけで、エラーがないと仮定することはできません。それでは、この信じられないほど便利な言語機能を使って、より良いコードを書くようにしましょう。
例えば、
var person = {
name : 'xyz',
position : 'abc',
fullname : function () { "use strict"; return this.name; }
};
JSLint はDouglas Crockfordによって書かれたデバッガです。スクリプトを貼り付けるだけで、コード内の顕著な問題やエラーをすばやくスキャンできます。
私は他の答えを補足するもう少し根拠のある答えを提供したいと思います。私は最も人気のある答えを編集したいと思っていましたが失敗しました。私はできるだけ包括的かつ完全なものにしようとしました。
詳細については MDNのドキュメント を参照してください。
"use strict"
ECMAScript 5で導入されたディレクティブ。
指令は文と似ていますが、異なります。
use strict
にはキーワードが含まれていません。指令は単純な式文で、特別な文字列リテラル(一重引用符または二重引用符)で構成されています。 ECMAScript 5を実装していないJavaScriptエンジンは、副作用のない式ステートメントを見るだけです。 ECMAScript規格の将来のバージョンでは、本当のキーワードとしてuse
を導入することが期待されています。それによって引用符は時代遅れになるでしょう。use strict
は、スクリプトまたは関数の始めにのみ使用できます。つまり、use strict
は、他のすべての(実際の)ステートメントの前になければなりません。関数のスクリプトの最初の命令である必要はありません。文字列リテラルからなる他のステートメント式を前に置くことができます(そしてJavaScript実装はそれらを実装固有のディレクティブとして扱うことができます)。 (スクリプトまたは関数内の)最初の実文に続く文字列リテラル文は、単純な式文です。通訳者はそれらを指令として解釈してはならず、また効果がありません。use strict
ディレクティブは、次のコード(スクリプトまたは関数内)が厳密なコードであることを示します。スクリプトの最上位レベルのコード(関数内にないコード)は、スクリプトが厳密なコードであると見なされます。関数自体が厳密なコードで定義されている場合、または関数にuse strict
ディレクティブが含まれている場合、関数の内容は厳密なコードと見なされます。 eval()
に渡されるコードeval()
が厳密なコードから呼び出された場合、またはuse strict
ディレクティブ自体が含まれている場合、methodは厳密なコードと見なされます。
ECMAScript 5の厳格モードはJavaScript言語の限定されたサブセットで、言語の関連する欠陥を排除し、より厳格なエラーチェックと高いセキュリティを特徴としています。以下に、厳密モードと通常モード(最初の3つが特に重要)の違いをリストします。
with
-ステートメントを使用することはできません。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()
が実行を終了した後に破壊されます。SyntaxError
演算子の後に修飾されていない識別子(変数、関数、または関数パラメータ)が続くと、delete
が返されます。通常モードではdelete
式は何もしないでfalse
と評価されます。TypeError
が返されます。 (通常モードでは、この試みは単に失敗し、delete
式はfalse
に評価されます)。0x
で始まるリテラルです。(通常モードではいくつかの実装は8進数リテラルを許可します)。eval
とarguments
はキーワードのように扱われます。それらの値を変更したり、それらに値を割り当てたりすることはできません。また、変数、関数、関数パラメータ、またはcatchブロックの識別子の名前として使用することはできません。arguments.caller
およびarguments.callee
は、厳密モードの関数内でTypeError
を発生させます。さらに、厳密モードの関数の一部のcaller-およびargumentsプロパティは、読み込もうとするとTypeError
を発生させます。私の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
を実装すると、コードはエラーをスローします。
不明なReferenceError:nameoftreeが定義されていません
with
ステートメントを削除します。
with
ステートメントは、 glify-js のようなツールを使用して縮小することはできません。それらも 廃止予定 であり、将来のJavaScriptバージョンからは削除されています。
重複を防ぐ:
重複したプロパティがあると例外がスローされます
未定のSyntaxError:オブジェクトリテラル中のデータプロパティが重複しています
"use strict";
var tree1Data = {
name: 'Banana Tree',
age: 100,
leafCount: 100000,
name:'Banana Tree'
};
他にもいくつかありますが、私はそれについてより多くの知識を得る必要があります。
あなたが昨年かそこらでリリースされたブラウザを使用するならば、それはたぶんJavaScript Strictモードをサポートします。 ECMAScript 5が現在の標準になる前の古いブラウザだけがそれをサポートしていません。
コマンドを囲む引用符は、コードが古いブラウザでも同様に機能することを確認します(ただし、厳密モードで構文エラーを生成するものは一般的にスクリプトを誤動作させ、古いブラウザでは検出が困難です)。
"use strict";
を追加するとき、次の場合はスクリプトが実行される前に SyntaxError をスローします。
新しく予約されたキーワードの1つを使用して、将来のECMAScriptバージョンへの道を開く(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ではもはや当てはまりません( bug 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() { }
出典:
厳密モードへの移行 MDN上
厳密モード MDN上
JavaScriptの厳密モードとなぜそれを使うべきか Colin J. Ihrigのブログ(アーカイブ版)
厳密モードでは、通常のJavaScriptのセマンティクスがいくつか変更されています。
エラーをスローするようにそれらを変更することで、いくつかのJavaScriptサイレントエラーを排除します。
javaScript エンジンが最適化を実行するのを困難にする誤りを修正しました。
eCMAScriptの将来のバージョンで定義される可能性があるいくつかの構文を禁止します。
詳細についてはvistit Strict Mode- Javascript
「厳密な使用」;は、プログラマがJavaScriptの緩いまたは悪いプロパティを使用しない保険です。これは、定規が直線を作るのを助けるように、ガイドです。 「厳密な使用」は、「ストレートコーディング」の実行に役立ちます。
定規を使用して行をまっすぐにしないことを好む人は、通常、他の人にコードをデバッグするよう求めるページに行き着きます。
私を信じてください。オーバーヘッドは、設計が不十分なコードに比べて無視できます。 数年前からJavaScriptの上級開発者であるDoug Crockfordが、ここで非常に興味深い投稿をしています 。個人的には、常に彼のサイトに戻って、良い習慣を忘れないようにしています。
最新のJavaScriptプラクティスでは、常に「Use Strict」を呼び出す必要があります。プラグマECMAグループが「厳密」モードをオプションにした唯一の理由は、経験の浅いコーダーがJavaScriptにアクセスできるようにし、新しい安全なコーディング慣行。
この時点からすべての機密性の高いJavaScriptファイルの先頭にuse strict
を含めることは、優れたJavaScriptプログラマーになり、ランダム変数がグローバルになって黙って変更されるのを防ぐための小さな方法です。
"use strict"ディレクティブ
"use strict"ディレクティブはJavaScript 1.8.5(ECMAScript バージョン5)の新機能です。
これはステートメントではなく文字通りの表現であり、以前のバージョンのJavaScriptでは無視されていました。
「厳密な使用」の目的は、コードが「厳密モード」で実行されるべきであることを示すことです。
厳密モードでは、例えば、宣言されていない変数を使用することはできません。
なぜ厳密モード?
厳密モードでは、 "安全な" JavaScriptの記述が簡単になります。
厳密なモード変更は、以前に受け入れられていた「不正な構文」を実際のエラーに変更しました。
例として、通常のJavaScriptでは、変数名をタイプミスすると新しいグローバル変数が作成されます。厳密モードでは、これはエラーを投げかけ[15]、誤ってグローバル変数を作成することを不可能にします。
通常のJavaScriptでは、開発者は書き込み不可能なプロパティに値を割り当てるエラーフィードバックを受け取ることはありません。
厳密モードでは、書き込み不可能なプロパティ、取得専用プロパティ、存在しないプロパティ、存在しない変数、または存在しないオブジェクトへの代入はすべてスローされますエラー。
http://www.w3schools.com/js/js_strict.asp を参照してください。
"use strict"
はJavaScriptコードをstrict modeで実行するようにします。これは基本的に、使用前にすべてを定義する必要があることを意味します。厳密モードを使用する主な理由は、未定義のメソッドが誤ってグローバルに使用されないようにするためです。
また、厳密モードでは、物事はより速く実行されます、いくつかの警告またはサイレント警告は致命的なエラーを投げます、より良いコードを作るために常にそれを使うのが良いです。
"use strict"
はECMA5で広く使用される必要があります ECMA6ではデフォルトでJavaScriptの一部です そのためES6を使用しているなら追加する必要はありません。
MDNからのこれらのステートメントと例を見てください。
「厳密な使用」指令
"use strict"ディレクティブは JavaScript 1.8.5(ECMAScript version 5)の新機能です。これはステートメントではなく、以前のバージョンのJavaScriptでは無視されるリテラル式です。 [厳密な使用]の目的は、コードを厳密モードで実行することを示すことです。厳密モードでは、のように宣言されていない変数を使用することはできません。「use 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:ECMAScript 5 ""use strict"
スイッチの増分使用がJavaScript実装者がJavaScriptの危険な機能の多くをきれいにする方法突然世界中のすべてのウェブサイトを壊すことなく。
もちろん、それはまさにそれらの多くの不正行為が何であるか(であったか)そしてECMAScript 5がそれらをどのように修正するかについても話します。
use strict
は EcmaScript 5 で導入され、それ以来維持されていたことに注意してください。
ES6 および ES7 で厳密モードをトリガーする条件は次のとおりです。
- グローバルコードがUse Strict Directiveを含むDirective Prologueで始まっている場合、グローバルコードはstrictモードコードです(14.1.1を参照)。
- モジュールコードは常に厳密モードコードです。
- ClassDeclaration または ClassExpression のすべての部分は、厳密モードコードです。
- 厳密な使用法指令を含むDirective Prologueで始まる場合、または厳密なモードコードに含まれる直接の評価(12.3.4.1を参照)である場合、評価コードは厳密モードコードです。
- 関連する FunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、MethodDefinition、またはArrowFunction が厳密モードコードに含まれている場合、または関数の値を生成するコードが[[ECMAScriptCode]] internalの場合、関数コードは厳密モードコードです。 slotはUse Strict Directiveを含むDirective Prologueで始まります。
- 最後の引数が処理時に FunctionBody であるStringである場合、組み込みのFunctionおよびGeneratorコンストラクターに引数として提供される関数コードは、厳密モードコードです。厳格な指令.
比較するための小さな例:
非厳密モード
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
開発者が"use strict"
を使用すべき主な理由は以下のとおりです。
グローバル変数の誤った宣言を防止します。"use strict()"
を使用すると、使用前に変数がvar
name__で宣言されていることを確認できます。 例えば:
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'};
}
"use strict"
ディレクティブは、スクリプトまたは関数の始めでのみ認識されます。文字列"arguments"
は変数として使用できません。
"use strict";
var arguments = 3.14; // This will cause an error
変数としてのキーワードの使用を制限します。使用しようとするとエラーが発生します。
手短に言えば、あなたのコードはエラーを起こしにくくなり、ひいてはあなたは良いコードを書くようになるでしょう。
それについてもっと読むためにあなたは ここ を参照することができます。
"厳密を使用する"; JavaScriptをもう少し堅牢にするためのECMAの取り組みです。それはJSにそれを少なくとも少し「厳格」にする試みをもたらします(他の言語は90年代以来厳格な規則を実行します)。実際、JavaScript開発者はある種のコーディングのベストプラクティスに従う必要があります。それでも、JavaScriptは非常に壊れやすいものです。型付き変数、型付きメソッドなどのようなものはありません。 JavaScript開発者は、JavaやActionScript3などのより堅牢な言語を習得し、同じベストプラクティスをJavaScriptコードに実装することを強くお勧めします。デバッグしやすくなりました。
use strict
はあなたのコードをより安全にする方法です、あなたが期待したように働かない危険な機能を使うことはできません。
Use Strictは、一般的なエラーと繰り返し発生するエラーを表示するために使用されます。そのため、処理方法が異なり、Javaスクリプトの実行方法が変わります。
偶発的なグローバルを防ぐ
重複なし
で排除する
この強制をなくす
より安全な評価()
不変のエラー
詳細は 記事 を読むこともできます。
通常、JavaScriptは厳密な規則に従っていないため、エラーが発生する可能性が高くなります。 "use strict"
を使用した後、JavaScriptコードは、ターミネータの使用、初期化前の宣言など、他のプログラミング言語の場合と同様に厳密な一連の規則に従う必要があります。
"use strict"
が使用されている場合、コードは厳密な規則のセットに従うことによって書かれるべきです、それゆえエラーとあいまいさの可能性を減らします。
JavaScriptの "strict"モードはECMAScript 5で導入されました。
(function() {
"use strict";
your code...
})();
JSファイルの一番上に"use strict";
を書くと、厳密な構文チェックが有効になります。それは私たちのために以下のタスクを行います:
宣言されていない変数に代入しようとするとエラーを表示します
主要なJSシステムライブラリを上書きしないようにします。
安全でない、またはエラーを起こしやすい言語機能を禁止します。
use strict
は個々の関数の中でも働きます。コードにuse strict
を含めることを常にお勧めします。
ブラウザ互換性の問題: "use"ディレクティブは後方互換性を保つためのものです。それらをサポートしないブラウザは、それ以上参照されない文字列リテラルを見るだけです。それで、彼らはそれを通り越して進みます。
厳密モードはメモリリークを防ぐことができます。
非厳密モードで書かれた以下の機能を確認してください。
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
ここで、コンパイラは参照エラーをスローします。厳格モードでは、コンパイラは変数を宣言せずに使用することを許可しません。したがって、メモリリークを防ぐことができます。さらに、より最適化されたコードを書くことができます。
"厳密な使用"; JavaScriptコードを [strict mode]で実行するように定義します。
最近のブラウザはすべてInternet Explorer 9以下を除いて "use strict"をサポートしています。
欠点
開発者が厳密モードのライブラリを使用していても、通常モードでの作業に慣れている場合、期待どおりに機能しないライブラリに対するアクションを呼び出すことがあります。
さらに悪いことに、開発者は通常モードであるため、余分なエラーが発生するという利点がないため、エラーが静かに失敗する可能性があります。
また、上にリストされているように、strictモードはあなたが特定のことをするのを止めます。
人々は一般的にあなたがそもそもそれらのものを使うべきではないと思います、しかし何人かの開発者は制約を好まず、そして言語のすべての機能を使いたくないです。
基本的な例と参考のために以下を通過してください。
https://www.tutorialsteacher.com/javascript/javascript-strict
非常に単純にするためには「厳密に使用」を使用します。 JSファイルの一番上にあるのは、厳密な構文検査をオンにします。
1: - これは宣言されていない変数に代入しようとすることを宣言させず、エラーを表示します。 2: - これは、安全でない、またはエラーを起こしやすい言語機能を禁止します。
function abc() { "use strict"; your code... };