1. 程式人生 > 其它 >為啥JS/TS裡都會有"use strict"

為啥JS/TS裡都會有"use strict"

摘要:在日常JS/TS專案開發過程中,經常會在檔案開頭看到"use strcit"字樣,這裡的“使用嚴格”是什麼意思?

本文分享自華為雲社群《JS/TS裡的"use strict"嚴格模式是什麼?》,作者: gentle_zhou。

在日常JS/TS專案開發過程中,經常會在檔案開頭看到" use strcit "字樣,這裡的“使用嚴格”是什麼意思?

看字面意思來解釋,就是這個專案檔案是在嚴格的條件下執行的。那麼什麼是嚴格的條件?為什麼我們需要嚴格的條件呢?

嚴格模式是什麼

"use strcit"是在 JavaScript 1.8.5 (ECMAScript5)版本中新增的:

"use strcit"並不是一條語句,而是一個擁有與普通程式碼不同含義的宣告;我們通過在指令碼或函式的頭部新增"use strcit"表示式來宣告嚴格模式的使用。嚴格模式的意義讓專案中程式碼可以在嚴格條件下執行,可以限制一些不良的編碼習慣,把問題在編碼階段就可以暴露出來。

支援嚴格模式的瀏覽器有:Internet Explorer 10 +、 Firefox 4+ Chrome 13+、 Safari 5.1+、 Opera 12+。

如何在瀏覽器檢視報錯資訊呢?我們可以按下F12按鈕或則點選瀏覽器頁面右上角的三個點-更多工具-開發者工具,開啟除錯模式:

然後點選控制檯tab,檢視報錯資訊:

為什麼我們需要嚴格模式

與嚴格模式相對的模式是sloppy mode(草率模式),從名字上我們就能看出來,它在我們編寫程式碼過程中的應對態度就是隨意的、草率的。Sloppy mode不是一個正式的名稱,只要我們沒有用嚴格模式來宣告,那麼這個js/ts檔案就處於sloppy mode中。

那麼我們為什麼要用嚴格模式(還需要額外宣告),而不是直接使用草率模式呢?

嚴格模式可以消除JS/TS語法裡一些不合理,不嚴謹的地方,可以讓JS/TS往更合理、更安全、更嚴謹的方向去發展:

  • 通過將一些JS/TS的靜默錯誤更改為丟擲錯誤,消除了JS/TS的一些靜默錯誤,能更加有效保障程式碼執行的安全;
  • 提高編譯器效率,增加執行速度;
  • 禁止一些可能在ECMAScript未來版本中定義的語法。


關於有哪些靜默錯誤,部分會在下面的嚴格模式限制例項section這一節裡展示。

嚴格模式限制例項

1、不允許使用未宣告的變數

在除錯模式下會顯示“Uncaught ReferenceError: x is not defined”

正確的表達應該是let x = 520;

2、不允許刪除變數或物件

在除錯模式下會顯示“Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.”

3、不允許刪除函式

在除錯模式下會顯示“Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.”

4、不允許變數重名

在除錯模式下會顯示“Uncaught SyntaxError: Duplicate parameter name not allowed in this context.”

5、不允許使用八進位制

在除錯模式下會顯示“Uncaught SyntaxError: Octal literals are not allowed in strict mode.”

6、不允許使用轉義字元

在除錯模式下會顯示“Uncaught SyntaxError: Invalid or unexpected token.”

7、不允許對只讀屬性賦值

在除錯模式下會顯示“Uncaught TypeError: Cannot assign to read only property 'x' of object '#<Object>'.”

8、不允許對一個使用getter方法讀取的屬性進行賦值

在除錯模式下會顯示“Uncaught TypeError: Cannot set property x of #<Object> which has only a getter.”

9、不允許刪除一個不允許刪除的屬性

在除錯模式下會顯示“Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }.”

10、變數名不能使用 “eval” 字串/“arguments” 字串

在除錯模式下會顯示“Uncaught SyntaxError: Unexpected eval or arguments in strict mode.”

11、不允許使用以下這種語句

在除錯模式下會顯示“Uncaught SyntaxError: Strict mode code may not include a with statement.”

12、由於一些安全原因,在作用域 eval() 建立的變數不能被呼叫

在除錯模式下會顯示“Uncaught ReferenceError: x is not defined.”

同時,為了向將來Javascript的新版本過渡,嚴格模式新增了一些保留關鍵字:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield

舉個栗子,如果我們變數名取為其中一個保留的關鍵字'public',那麼就會報錯“Uncaught SyntaxError: Unexpected strict mode reserved word”

參考連結

  1. http://www-lia.deis.unibo.it/materiale/JS/developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/1.8-2.html
  2. https://developer.mozilla.org/en-US/docs/web/javascript/reference/strict_mode
  3. https://developer.mozilla.org/en-US/docs/Glossary/Sloppy_mode
  4. https://www.runoob.com/js/js-strict.html

 

點選關注,第一時間瞭解華為雲新鮮技術~