JavaScriptの厳密なモード

厳密モードはES5の機能であり、JavaScriptをより適切に動作させる方法です。また、別の方法では、厳密モードを有効にするとJavaScript言語のセマンティクスが変更されます。 strictモードのJavaScriptコードと、ずさんなモードと呼ばれることが多い通常のJavaScriptの主な違いを知ることは非常に重要です。

厳密モードはES5機能、そしてそれはJavaScriptを動作させる方法ですより良い方法

そして、別の方法、厳密モードを有効にすると、JavaScript言語のセマンティクスが変更されます。

厳密モードのJavaScriptコードと、「通常の」JavaScriptとの主な違いを知ることは非常に重要です。ずさんなモード

厳密モードは、ES3で可能であった機能をほとんど削除し、ES5以降は非推奨になりました(ただし、下位互換性要件のために削除されません)

厳密モードを有効にする方法

厳密モードはオプションです。 JavaScriptのすべての重大な変更と同様に、デフォルトで言語の動作を変更することはできません。これは、膨大な数のJavaScriptを破棄するためです。また、JavaScriptは、1996年のJavaScriptコードが今日でも機能するように多大な努力を払っています。それはその成功の鍵です。

だから私たちは'use strict'厳密モードを有効にするために使用する必要のあるディレクティブ。

ファイルの先頭に配置して、ファイルに含まれるすべてのコードに適用できます。

'use strict'

const name = ‘Flavio’ const hello = () => ‘hey’

//…

次のように入力することで、個々の機能に対して厳密モードを有効にすることもできます。'use strict'関数本体の先頭:

function hello() {
  'use strict'

return ‘hey’ }

これは、テストする時間がない、またはファイル全体で厳密モードを有効にする自信がないレガシーコードを操作する場合に役立ちます。

厳密モードで何が変わるか

偶発的なグローバル変数

宣言されていない変数に値を割り当てると、JavaScriptはデフォルトでグローバルオブジェクトにその変数を作成します。

;(function() {
  variable = 'hey'
})()(() => {
  name = 'Flavio'
})()

variable //‘hey’ name //‘Flavio’

厳密モードをオンにすると、上記で行ったことを実行しようとするとエラーが発生します。

;(function() {
  'use strict'
  variable = 'hey'
})()(() => {
  'use strict'
  myname = 'Flavio'
})()

Variable not defined

割り当てエラー

JavaScriptはいくつかの変換エラーを黙って失敗します。

厳密モードでは、これらのサイレントエラーによって問題が発生するようになりました。

const undefined = 1(() => {
  'use strict'
  undefined = 1
})()

同じことがInfinity、NaN、evalargumentsもっと。

JavaScriptでは、を使用して、オブジェクトのプロパティを書き込み不可として定義できます。

const car = {}
Object.defineProperty(car, 'color', { value: 'blue', writable: false })

strictモードでは、この値をオーバーライドすることはできませんが、sloppyモードでは次のことが可能です。

ゲッターにも同じことが言えます。

const car = {
  get color() {
    return 'blue'
  }
}
car.color = 'red'(
  //ok

  () => {
    'use strict'
    car.color = 'yellow' //TypeError: Cannot set property color of #<Object> which has only a getter
  }
)()

ずさんなモードでは、拡張不可能なオブジェクトを拡張できます。

const car = { color: 'blue' }
Object.preventExtensions(car)
car.model = 'Fiesta'(
  //ok

  () => {
    'use strict'
    car.owner = 'Flavio' //TypeError: Cannot add property owner, object is not extensible
  }
)()

(見るObject.preventExtensions()

また、ずさんなモードでは、失敗することなく、また何もせずに、プリミティブ値にプロパティを設定できます。

true.false = ''(
  //''
  1
).name =
  'xxx' //'xxx'
var test = 'test' //undefined
test.testing = true //true
test.testing //undefined

厳密モードは、次のすべての場合に失敗します。

;(() => {
  'use strict'
  true.false = ''(
    //TypeError: Cannot create property 'false' on boolean 'true'
    1
  ).name =
    'xxx' //TypeError: Cannot create property 'name' on number '1'
  'test'.testing = true //TypeError: Cannot create property 'testing' on string 'test'
})()

削除エラー

ずさんなモードでは、削除できないプロパティを削除しようとすると、JavaScriptはfalseを返しますが、厳密モードでは、TypeErrorが発生します。

delete Object.prototype(
  //false

  () => {
    'use strict'
    delete Object.prototype //TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
  }
)()

同じ名前の関数の引数

通常の関数では、パラメーター名を重複させることができます。

(function(a, a, b) {
  console.log(a, b)
})(1, 2, 3)
//2 3

(function(a, a, b) { ‘use strict’ console.log(a, b) })(1, 2, 3) //Uncaught SyntaxError: Duplicate parameter name not allowed in this context

矢印関数は常にSyntaxErrorこの場合:

((a, a, b) => {
  console.log(a, b)
})(1, 2, 3)
//Uncaught SyntaxError: Duplicate parameter name not allowed in this context

8進構文

厳密モードの8進構文は無効になっています。デフォルトでは、08進数形式と互換性のある数値にすると、(混乱を招くこともありますが)8進数として解釈されます。

(() => {
  console.log(010)
})()
//8

(() => {
  'use strict'
  console.log(010)
})()
//Uncaught SyntaxError: Octal literals are not allowed in strict mode.

厳密モードでは、次を使用して8進数を有効にすることができます。0oXX構文:

;(() => {
  'use strict'
  console.log(0o10)
})()
//8

削除されましたwith

厳密モードでは、withキーワード。いくつかのエッジケースを削除し、コンパイラレベルでさらに最適化できるようにします。

私の無料ダウンロードJavaScriptビギナーズハンドブック


その他のjsチュートリアル: