js:嚴(yán)格模式

嚴(yán)格模式:js的一種運(yùn)行模式,設(shè)立嚴(yán)格模式主要有以下幾個(gè):

? ? 1、消除js語(yǔ)法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為;

? ? 2、消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全;

? ? 3、提高編譯器效率,增加運(yùn)行速度;

 4、為未來(lái)新版本的js做好鋪墊。



語(yǔ)法和行為的改變:

1、全局變量顯示聲明:在非嚴(yán)格模式下,一個(gè)變量如果沒(méi)有聲明就使用會(huì)被隱式為全局變量,但是嚴(yán)格模式下禁止這種用法、嚴(yán)格模式下,變量都必須先用var命令聲明,然后在使用。測(cè)試如下:


2、靜態(tài)綁定:

js語(yǔ)言有允許“動(dòng)態(tài)綁定”的特點(diǎn)(即某些屬性和方法到底屬于哪一個(gè)對(duì)象不是在編譯時(shí)確定的。而是在運(yùn)行時(shí)確定的)。

嚴(yán)格模式對(duì)動(dòng)態(tài)綁定做了一些限制。在某些情況下,只允許靜態(tài)綁定,也就是說(shuō)屬性和方法到底屬于哪一個(gè)對(duì)象,在編譯階段就確定了,這樣有利于編譯效率的提高,也使得代碼更容易閱讀,更少出現(xiàn)意外。

a、禁止使用with語(yǔ)句:因?yàn)閣ith語(yǔ)句無(wú)法在編譯時(shí)就確定屬性到底屬于哪個(gè)對(duì)象。


b、創(chuàng)建eval作用域:非嚴(yán)格模式下,js有兩種變量作用域(全局作用域和函數(shù)作用域)嚴(yán)格模式下創(chuàng)建第三種作用域:eval作用域

非嚴(yán)格模式:eval語(yǔ)句的作用域取決于它處于全局作用域還是處于函數(shù)作用域。

嚴(yán)格模式:eval語(yǔ)句的作用域本身就是一個(gè)作用域,不再能夠生成全局全局變量,它所生成的變量只能用于eval內(nèi)部。

測(cè)試如下:


3、增強(qiáng)安全性

a、禁止this關(guān)鍵字指向全局對(duì)象

function f(){

return !this;

}?

// 返回false,因?yàn)?this"指向全局對(duì)象,"!this"就是false

function f(){?

"use strict";

return !this;

}?

// 返回true,因?yàn)閲?yán)格模式下,this的值為undefined,所以"!this"為true。

因此,使用構(gòu)造函數(shù)時(shí),如果忘了加new,this不再指向全局對(duì)象,而是報(bào)錯(cuò)。

測(cè)試如下:


b、禁止在函數(shù)內(nèi)部遍歷調(diào)用棧

測(cè)試如下:


4、禁止刪除變量

嚴(yán)格模式下無(wú)法刪除變量。只有configurabale設(shè)置為true的對(duì)象屬性才能被刪除。

測(cè)試如下:


5、顯示報(bào)錯(cuò):

正常模式下,對(duì)一個(gè)對(duì)象的只讀屬性進(jìn)行賦值,不會(huì)報(bào)錯(cuò)只會(huì)失敗,但嚴(yán)格模式下將會(huì)報(bào)錯(cuò):


備注:另外,嚴(yán)格模式下,對(duì)一個(gè)使用getter方法讀取的屬性進(jìn)行賦值,也會(huì)報(bào)錯(cuò)。 對(duì)禁止擴(kuò)展的對(duì)象添加新屬性,會(huì)報(bào)錯(cuò)。 刪除一個(gè)不可刪除的屬性,會(huì)報(bào)錯(cuò)(即對(duì)已設(shè)置好的屬性標(biāo)簽強(qiáng)制操作會(huì)報(bào)錯(cuò))

6、重名錯(cuò)誤:

a、對(duì)象不能有重名屬性、函數(shù)不能有重名參數(shù):

1:正常模式下,如果對(duì)象有多個(gè)重名屬性,最后賦值的那個(gè)屬性會(huì)覆蓋前面的值。嚴(yán)格模式下,這屬于語(yǔ)法錯(cuò)誤。

2:正常模式下,如果函數(shù)有多個(gè)重名的參數(shù),可以用arguments[i]讀取。嚴(yán)格模式下,這屬于語(yǔ)法錯(cuò)誤。

測(cè)試如下:

備注:嚴(yán)格模式下對(duì)象的屬性重名報(bào)錯(cuò)與實(shí)際測(cè)試不一致。

7、禁止使用八進(jìn)制:

正常模式下,整數(shù)的第一位如果是0,表示這是八進(jìn)制數(shù),比如0100等于十進(jìn)制的64。嚴(yán)格模式禁止這種表示法,整數(shù)第一位為0,將報(bào)錯(cuò)。

8、arguments對(duì)象的限制

arguments是函數(shù)的參數(shù)對(duì)象,嚴(yán)格模式對(duì)它的使用做了限制。限制如下

a、arguments不再追蹤參數(shù)變化

測(cè)試如下:


備注:代碼中第一次是非嚴(yán)格模式下,通過(guò)arguments賦值改變了參數(shù)。

b、不允許對(duì)arguments賦值

 "use strict";

  arguments++; // 語(yǔ)法錯(cuò)誤

  var obj = { set p(arguments) { } }; // 語(yǔ)法錯(cuò)誤

  try { } catch (arguments) { } // 語(yǔ)法錯(cuò)誤

  function arguments() { } // 語(yǔ)法錯(cuò)誤

  var f = new Function("arguments", "'use strict'; return 17;"); // 語(yǔ)法錯(cuò)誤

c、禁止使用arguments.callee(無(wú)法在匿名函數(shù)內(nèi)部調(diào)用自身):

測(cè)試如下:


9、保留字:

為了向?qū)?lái)Javascript的新版本過(guò)渡,嚴(yán)格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。

使用這些詞作為變量名將會(huì)報(bào)錯(cuò)

此外,ECMAscript第五版本身還規(guī)定了另一些保留字(class, enum, export, extends, import, super),以及各大瀏覽器自行增加的const保留字,也是不能作為變量名的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、概述 除了正常運(yùn)行模式,ECMAscript 5添加了第二種運(yùn)行模式:"嚴(yán)格模式"(strict mode)。...
    才気莮孒閱讀 248評(píng)論 0 1
  • 'use strict' 是在一個(gè)嚴(yán)格的模式下 在正常模式中,如果一個(gè)變量沒(méi)有聲明就賦值,默認(rèn)是全局變量。嚴(yán)格模式...
    FConfidence閱讀 316評(píng)論 0 0
  • 通過(guò)嚴(yán)格模式,可以在函數(shù)內(nèi)部 選擇進(jìn)行較為嚴(yán)格的全局或局部的錯(cuò)誤條件檢測(cè)。使用嚴(yán)格模式的好處是可以提早知道代碼中存...
    oWSQo閱讀 576評(píng)論 0 0
  • "use strict"使用"use strict"指令的目的是說(shuō)明(腳本或函數(shù)中)后續(xù)的代碼將會(huì)解析為嚴(yán)格代碼(...
    80bb3ef13dea閱讀 1,535評(píng)論 0 6
  • 我想起你的時(shí)候 你是世上最美的風(fēng)景 因?yàn)槟阍谖倚睦?/div>
    游鳥(niǎo)飛雨閱讀 252評(píng)論 0 1

友情鏈接更多精彩內(nèi)容