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




node.js style guide (20)

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

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

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

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

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


通常、Javaスクリプトは厳密なルールに従わないため、エラーの可能性が高くなります。使用後"use strict"、Javaスクリプトコードは、ターミネータの使用、初期化前の宣言など、他のプログラミング言語のように、厳密な規則のセットに従うべきです。

if "use strict"を使用すると、コードは厳密なルールのセットに従って記述する必要があり、エラーとあいまいさの可能性が減ります。


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

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

"use strict";

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


w3schoolsからの引用

「厳格な使用」指令

"strict strict"指示はJavaScript 1.8.5(ECMAScript version 5)の新機能です。

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

「厳密な使用」の目的は、コードが「厳密モード」で実行されるべきであることを示すことです。

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

なぜ厳密なモードですか?

Strictモードを使用すると、「安全」なJavaScriptを簡単に記述できます。

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

たとえば、通常のJavaScriptでは、変数名を間違えて入力すると、新しいグローバル変数が作成されます。strictモードでは、これによりエラーが発生し、誤ってグローバル変数を作成することができなくなります。

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

strictモードでは、書き込み不可能なプロパティ、ゲッター専用プロパティ、存在しないプロパティ、存在しない変数、または存在しないオブジェクトへの割り当てはエラーを投げます。

詳細はhttp://www.w3schools.com/js/js_strict.aspを参照してください。


"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"適用することは危険です! このことは気分が良い、ハッピー・フェイスのステッカーではなく、コードを叩いて「より良い」ものにすることができます。 "use strict"プラグマを"use strict"と、ブラウザは、その場所でデフォルト/緩やかなJavaScriptがうまくいくということをしているだけなので、突然例外をスローします。 ごくまれに使用されたコードでは、最終的に実行されるときに例外をスローする厳密な違反がコード内に隠れているかもしれません。たとえば、支払う顧客が使用するプロダクション環境の場合です。

プランジを行う場合は、包括的なユニットテストと厳密に設定されたJSHintビルドタスクのあとに"use strict"する"use strict"を適用することをお勧めします"use strict"これはモジュールの暗いコーナーが爆発することのない確信を与えます恐ろしく、Strict Modeがオンになっているからです。 または、ちょっと、別のオプションがあります:あなたのレガシーコードに"use strict"を追加しないでください。正直なところ、おそらくもっと安全でしょう。 第三者のモジュールのように、あなたが所有していない、または保守していないモジュールには、 "use strict"追加しないでください。

私はそれが致命的なケージ動物であるにもかかわらず、 "use strict"は良いものになることができますが、あなたはそれを正しく行う必要があります。 あなたのプロジェクトがグリーンフィールドであり、あなたが最初から始めているときは、厳密になるための最善の時間です。 すべての警告とオプションをあなたのチームが胃のようにきつくJSHint/JSLintJSHint/JSLintを設定し、 Grunt+Karma+Chaiような優れたビルド/テスト/アサートシステムを手に入れてください"use strict" 。 不快なエラーや警告がたくさん出るように準備してください。 JSHint/JSLintが違反を生成する場合は、ビルドをFAILに設定することによって、誰もが重力を理解できるようにしてください。

私のプロジェクトは、 "use strict"を採用したときにグリーンフィールドプロジェクトではありませんでした。 その結果、私のIDEは赤いマークでいっぱいです。なぜなら私のモジュールの半分には"use strict"がなく、JSHintはそれについて不平を言います。 これは、私が将来リファクタリングするべきことを私に思い出させるものです。 私の目標は、私の行方不明の"use strict"陳述のために赤いマークフリーであることですが、それは数年前です。


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

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


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


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

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

  • 重複はありません

  • 排除する

  • この強制を排除する

  • より安全なeval()

  • immutablesのエラー

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


"厳密に使う";JavaScriptを少し頑強にするためのECMAの取り組みです。それはJSに、少なくとも少し厳しい(他の言語が90年代から厳格な規則を実装している)ようにする試みをもたらします。実際には、JavaScript開発者にある種のコーディングのベストプラクティスに従わせるよう強制しています。それでも、JavaScriptは非常に脆弱です。型付き変数や型付きメソッドなどはありません.JavaScriptやActionScript3などのより堅牢な言語を学び、JavaScriptコードに同じベストプラクティスを実装することを強くお勧めします。デバッグ。


ステートメント"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 ]


"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 あなたのコードをより安全にする方法です。あなたが期待した通りに動作しない危険な機能を使用することはできません。


比較する小さな例:

非厳密モード:

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

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

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

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

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


JavaScriptの "strict"モードでは、ECMAScript 5が導入されています。

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

"use strict"を書く。JSファイルの一番上にある厳密な構文チェックが有効になります。それは私たちのために以下のタスクを行います:

(i)は、宣言されていない変数に代入しようとするとエラーを表示します

(ii)キーJSシステムライブラリを上書きしないようにする

(ii)安全でないか、エラーを起こしやすい言語機能を禁止する

"use strict"は個々の機能の内部でも動作します。「あなたのコードに厳密に使用する」を含めることは、常により良い方法です。

ブラウザーの互換性の問題:「使用」ディレクティブは下位互換性があります。それらをサポートしていないブラウザは、それ以上参照されない文字列リテラルが表示されます。だから、彼らはそれを越えて移動します。


私の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 strictuse strictだけではなく、エラーがないと仮定します。 だから、チャンスは、これは非常に便利な言語機能を使用してより良いコードを書くことを開始することです。

例えば、

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

JSLintは、Douglas Crockfordによって書かれたデバッガです。 スクリプトに貼り付けるだけで、コード内の目立つ問題やエラーをすばやくスキャンします。


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

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


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

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

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


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

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

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

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

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





use-strict