JavaScript嚴格模式

嚴格模式是ES5的功能,它是使JavaScript表現得更好的一種方式。並且以不同的方式,啟用嚴格模式會更改JavaScript語言的語義。了解嚴格模式下的JavaScript代碼與通常稱為草率模式的普通JavaScript之間的主要區別非常重要

嚴格模式是ES5功能,這是一種使JavaScript在更好的方法

並在不同的方式,因為啟用嚴格模式會更改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 })

在嚴格模式下,您不能覆蓋此值,而在草率模式下,則可以:

同樣適用於吸氣劑:

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

八進制語法

嚴格模式下的八進制語法已禁用。默認情況下,0與八進制數字格式兼容的數字使其(有時會引起混淆)被解釋為八進制數字:

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

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

您仍可以使用0oXX句法:

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

已移除with

嚴格模式禁用with關鍵字,以消除一些極端情況,並允許在編譯器級別進行更多優化。

免費下載我的JavaScript初學者手冊


更多js教程: