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






