web-dev-qa-db-ja.com

私が書くすべてのJavaScript関数に「厳密」を使用する必要がありますか?

私が書くすべてのJavaScript関数に「厳密」を使用する必要がありますか?

大規模なAngularJSプロジェクトでstrictを使用する良い方法は何ですか?それをグローバルに使用すると、それをサポートしていないサードパーティのライブラリが壊れる可能性がありますが、毎回 'strictを使用する'ことは繰り返しの繰り返しにすぎません。

25
Won Jun Bae

この質問については、過度に単純化する傾向に注意してください。

まず、すべてのコードは厳密にstrictモードで実行する必要があります。厳密なモードの外部でコードを実行することにより、最新のJavaScriptのコア機能が変更されます( 。call()およびapply() を参照)または変更( silent Errors )。 (これの詳細 ここ 、クロックフォードから。)

ただし、これはhowには対応していません。コードを厳密モードで実行する必要があります。考慮すべき少なくとも2つのコンテキストがあります。

ブラウザでは、コードは縮小されてから配信されます。すべての関数本体に'use strict'を含めると、ミニファイアはそれを取り除きませんし、どこにでもそれを繰り返すバイトを無駄にします。これは、モジュール定義の最上部にある最も外側の関数スコープでのみ必要です。 1つのアプローチは、ビルドプロセスの一部として、縮小されたコードを単一のIIFEクロージャーでラップすることです。

;(function (){ 
  'use strict'
  // All code here.
}())

これは理想的な方法に近いと思いますが、多かれ少なかれ、継続的インテグレーションワークフローを採​​用する必要があります(厳密なモードで実行されているコードを観察するには、すべてを1つのクロージャでラップする必要があるため)。 。その方法で作業しない場合は、別の関数のスコープ内で宣言されていないすべての関数の先頭にuse strictディレクティブを含める必要があります。

サーバーではもちろん、はるかに簡単です。コードは縮小されておらず、バイトも関係ないため、すべてのファイルの先頭にuse strictディレクティブを含めるだけです。

--use_strictに関する警告の言葉:スクリプトの実行方法を制御している場合、--use_strictランタイムフラグを使用したくなるかもしれません。簡単ですが、すべての依存関係は厳密モードに準拠している必要があります。すべてのサードパーティのコンプライアンスを制御することはできないため、これは通常賢明ではありません。

18
jeff_mcmahan

あなたが書くすべてのコード1 すべき厳密なモード の中にあります。それは例外を無視しないことによって 間違いを見つけやすくする です。

ただし、no、これは、すべてのfunction定義に"use strict";を付加する必要があることを意味するのではなく、モジュールのスコープで-ファイルごとに1回-すべての関数によって継承されるようにします。 ES6モジュールに切り替えるときは 暗黙のうちに とにかく。

1:strictモードは適切に記述されたコードを壊さないため、グローバルに有効にすることについても主張します。
doesがサードパーティのスクリプトを壊した場合、解決策は、strictモードを再度無効にすることではないかもしれません…

13
Bergi

短い答え、はい!すべての関数に含める必要はありませんが、JavaScriptファイルごとに1回だけ追加できます。ファイルを開始するときは、次のようなクロージャーから始めます。

(function () {
  "use strict";
  // Rest of your code.

})();

いいえ。冗長性は必要ありません。宣言の使用

"use strict";

特にサードパーティのライブラリを使用している場合は、ファイルスコープまたはストリームスコープでの使用が推奨されます。そのまま使用するか、ラップするか、そのまま使用するかを決定するのに役立ちます。

ファイルレベルの自己実行関数

自己実行クロージャーでファイル全体またはストリームを表示することが一般的になりつつあります。そのような場合、厳密モード(上記)を使用する宣言が、クロージャーの最初の行に挿入されます。

(function () { 
    ...
}())

自己実行が常に必要であるとは限らず、過度に使用すると、負荷の低下やその他の問題が実際に発生する可能性があることを言及しておくと役立ちます。

宣言の範囲の詳細

のスコープは、宣言を関数の内部または外部のどちらに置くかに依存し、クロージャーのスコープ内で宣言に続くすべてのステートメントに適用されます。

関数内での宣言の使用は、すべてのファイルまたはストリームがすでにより厳密なモードと互換性があるか、または簡単に作成できる場合は、間違った方法です。冗長性は不要であるため、宣言をファイルの先頭またはストリームの先頭に配置することをお勧めします。

場合によっては、一部の関数だけがより厳しい規則に準拠することがあります。そのような場合、宣言のあまり望ましくない関数スコープを使用して、少なくともすでに準拠している関数で、より細かいコーディングプラクティスを奨励できます。

Strict Modeを使用する理由

Strictモードは、言語設計の観点から望ましくないと見なされる特定の許容言語解析および実行特性を排除します。これらの非厳密モードの言語特性は、下位互換性のためのデフォルトの動作として慎重であると見なされていました。概要と詳細はここに表示されます。

Netscapeの初期の時代の古い言語の特性がいつ廃止されるか、またはいつか厳格モードがブラウザー全体のデフォルトの動作になるかどうかは明確に定義されていませんが、より厳密なモデルはあいまいでリスクの少ないソースを生成する可能性があります。コーディングの実践とコードベースの保守性、移植性、拡張性を向上させたい場合は、ストリクトモードが適切なオプションです。


[〜#〜]注[〜#〜]ここから来る人のために "" function()を使用する利点は何ですか?すべてのファイルでstrict '”? "

あなたは置くことができます

"use strict";

コードシーケンスの上部または関数内にあるため、ファイルまたは関数ごとに1行のコードになります。

コードの他の行には、コードの他の目的 here があります。

  • 自己呼び出し機能
  • 工場呼び出し

ファイル全体を自己実行関数に入れるものもありますが、必ずしもそうである必要はありません。

4
Douglas Daseeco