什么是嚴格模式.
JAVAScript 除了提供正常模式外,還提供了嚴格模式(strict mode)。ES5 的嚴格模式是采用具有限制性 JavaScript 變體的一種方式,即在嚴格的條件下運行 JS 代碼。
嚴格模式在 IE10 以上版本的瀏覽器中才會被支持,舊版本瀏覽器中會被忽略。
嚴格模式對正常的 JavaScript 語義做了一些更改:
1.消除了 Javascript 語法的一些不合理、不嚴謹之處,減少了一些怪異行為。
2.消除代碼運行的一些不安全之處,保證代碼運行的安全。
3.提高編譯器效率,增加運行速度。
4.禁用了在 ECMAScript 的未來版本中可能會定義的一些語法,為未來新版本的 Javascript 做好鋪墊。比如一些保留字如:class, enum, export, extends, import, super 不能做變量名
開啟嚴格模式
嚴格模式可以應用到整個腳本或個別函數中。因此在使用時,我們可以將嚴格模式分為為腳本開啟嚴格模式和為函數開啟嚴格模式兩種情況。
1. 為腳本開啟嚴格模式
為整個腳本文件開啟嚴格模式,需要在所有語句之前放一個特定語句“use strict”;(或‘use strict’;)。
因為"use strict"加了引號,所以老版本的瀏覽器會把它當作一行普通字符串而忽略。
有的 script 基本是嚴格模式,有的 script 腳本是正常模式,這樣不利于文件合并,所以可以將整個腳本文件放在一個立即執行的匿名函數之中。這樣獨立創建一個作用域而不影響其他 script 腳本文件。
2. 為函數開啟嚴格模式
要給某個函數開啟嚴格模式,需要把“use strict”; (或 'use strict'; ) 聲明放在函數體所有語句之前。
將 "use strict" 放在函數體的第一行,則整個函數以 "嚴格模式" 運行。
嚴格模式就是嚴格執行的方式,像以前class是可以作為變量,變量沒有聲明var在普通模式都是可以執行的,但是用了‘use strict’嚴格模式,那就是不合法的
嚴格模式中的變化
嚴格模式對 Javascript 的語法和行為,都做了一些改變。
1. 變量規定
①在正常模式中,如果一個變量沒有聲明就賦值,默認是全局變量。嚴格模式禁止這種用法,變量都必須先用var 命令聲明,然后再使用。
②嚴禁刪除已經聲明變量。例如,delete x; 語法是錯誤的。
2. 嚴格模式下 this 指向問題
①以前在全局作用域函數中的 this 指向 window 對象。
②嚴格模式下全局作用域中函數中的 this 是 undefined。
③以前構造函數時不加 new也可以 調用,當普通函數,this 指向全局對象
④嚴格模式下,如果 構造函數不加new調用, this 指向的是undefined 如果給他賦值則 會報錯
⑤new 實例化的構造函數指向創建的對象實例。
⑥定時器 this 還是指向 window 。
⑦事件、對象還是指向調用者。
3. 函數變化
①函數不能有重名的參數。
②函數必須聲明在頂層.新版本的 JavaScript 會引入“塊級作用域”( ES6 中已引入)。為了與新版本接軌,不允許在非函數的代碼塊內聲明函數。