摘要:在嚴(yán)格模式中,當(dāng)運(yùn)算符后跟隨非法的標(biāo)識(shí)符比如變量函數(shù)函數(shù)參數(shù)時(shí),將會(huì)拋出一個(gè)語法錯(cuò)誤異常在非嚴(yán)格模式中,這種表達(dá)式什么也沒做,并返回。
JavaScript之“use strict”
“use strict"是ECMAScript 5引入的一條指令。
指令不是語句(但非常接近于語句)。“usestrict"指令和普通的語句之間有兩個(gè)重要的區(qū)別:
它不包含任何語言的關(guān)鍵字,指令僅僅是一個(gè)包含一個(gè)特殊字符串直接量的表達(dá)式(可以是使用單引號(hào)也可以使用雙引號(hào)),對(duì)于那些沒有實(shí)現(xiàn)ECMAScript 5的JavaScript解釋器來說,它只是一條沒有副作用的表達(dá)式語句,它什么也沒做。將來的ECMAScript標(biāo)準(zhǔn)希望將use用做關(guān)鍵字,這樣就可以省略引號(hào)了。
它只能出現(xiàn)在腳本代碼的開始或者函數(shù)體的開始、任何實(shí)體語句之前。但它不必一-定出現(xiàn)在腳本的首行或函數(shù)體內(nèi)的首行,因?yàn)椤皍se strict" 指令之后或之前都可能有其他字符串直接量表達(dá)式語句,并且JavaScript的具體實(shí)現(xiàn)可能將它們解析為解釋器自有的指令。在腳本或者函數(shù)體內(nèi)第一條常規(guī)語句之后字符串直接量表達(dá)式語句只當(dāng)做普通的表達(dá)式語句對(duì)待;它們不會(huì)當(dāng)做指令解析,它們也沒有任何副作用。
使用“use strict" 指令的目的是說明(腳本或函數(shù)中)后續(xù)的代碼將會(huì)解析為嚴(yán)格代碼(strict code)。如果頂層(不在任何函數(shù)內(nèi)的)代碼使用了“use strict" 指令,那么它們就是嚴(yán)格代碼。如果函數(shù)體定義所處的代碼是嚴(yán)格代碼或者函數(shù)體使用了“use strict"指令,那么函數(shù)體的代碼也是嚴(yán)格代碼。如果eva1()調(diào)用時(shí)所處的代碼是嚴(yán)格代碼或者eval()要執(zhí)行的字符串中使用了“scrict code”指令,則eval()內(nèi)的代碼是嚴(yán)格代碼。
嚴(yán)格代碼以嚴(yán)格模式執(zhí)行。ECMAScript 5中的嚴(yán)格模式是該語言的一個(gè)受限制的子集,它修正了語言的重要缺陷,并提供健壯的查錯(cuò)功能和增強(qiáng)的安全機(jī)制。
嚴(yán)格模式和非嚴(yán)格模式之間的區(qū)別如下(前三條尤為重要) :
在嚴(yán)格模式中禁止使用with語句。
在嚴(yán)格模式中,所有的變量都要先聲明,如果給一個(gè)未聲明的變量、函數(shù)、函數(shù)參數(shù)、catch從句參數(shù)或全局對(duì)象的屬性賦值,將會(huì)拋出一個(gè)引用錯(cuò)誤異常(在非嚴(yán)格模式中,這種隱式聲明的全局變量的方法是給全局對(duì)象新添加一一個(gè)新屬性)。
在嚴(yán)格模式中,調(diào)用的函數(shù)(不是方法)中的一個(gè)this值是undefined。(在非嚴(yán)格模式中,調(diào)用的函數(shù)中的this值總是全局對(duì)象)。可以利用這種特性來判斷JavaScript實(shí)現(xiàn)是否支持嚴(yán)格模式:
var hasstrictMode = (function() { "use strict"; return this==undefined}());
同樣,在嚴(yán)格模式中,當(dāng)通過call()或app1y()來調(diào)用函數(shù)時(shí),其中的this值就是通過call()或apply()傳入的第一個(gè)參數(shù)(在非嚴(yán)格模式中,null和undefined值被全局對(duì)象和轉(zhuǎn)換為對(duì)象的非對(duì)象值所代替)。
在嚴(yán)格模式中,給只讀屬性賦值和給不可擴(kuò)展的對(duì)象創(chuàng)建新成員都將拋出-一個(gè)類型錯(cuò)誤異常(在非嚴(yán)格模式中,這些操作只是簡(jiǎn)單地操作失敗,不會(huì)報(bào)錯(cuò))。
在嚴(yán)格模式中,傳人eval()的代碼不能在調(diào)用程序所在的上下文中聲明變量或定義函數(shù),而在非嚴(yán)格模式中是可以這樣做的。相反,變量和函數(shù)的定義是在eval()創(chuàng)建的新作用域中,這個(gè)作用域在eval()返回時(shí)就棄用了。
在嚴(yán)格模式中,函數(shù)里的arguments對(duì)象(見8.3.2節(jié)) 擁有傳入函數(shù)值的靜態(tài)副本。在非嚴(yán)格模式中,arguments對(duì)象具有 “魔術(shù)般”的行為,arguments 里的數(shù)組元素和函數(shù)參數(shù)都是指向同一個(gè)值的引用。
在嚴(yán)格模式中,當(dāng)delete運(yùn)算符后跟隨非法的標(biāo)識(shí)符(比如變量、函數(shù)、函數(shù)參數(shù))時(shí),將會(huì)拋出一個(gè)語法錯(cuò)誤異常(在非嚴(yán)格模式中,這種delete表達(dá)式什么也沒做,并返回false)。
在嚴(yán)格模式中,試圖刪除-一個(gè)不可配置的屬性將拋出一個(gè)類型錯(cuò)誤異常(在非嚴(yán)格模式中,delete表達(dá)式操作失敗,并返回false)。
在嚴(yán)格模式中,在一個(gè)對(duì)象直接量中定義兩個(gè)或多個(gè)同名屬性將產(chǎn)生-一個(gè)語法錯(cuò)誤(在非嚴(yán)格模式中不會(huì)報(bào)錯(cuò))。
在嚴(yán)格模式中,函數(shù)聲明中存在兩個(gè)或多個(gè)同名的參數(shù)將產(chǎn)生-一個(gè)語法錯(cuò)誤(在非嚴(yán)格模式中不會(huì)報(bào)錯(cuò))。
在嚴(yán)格模式中是不允許使用八進(jìn)制整數(shù)直接量(以0為前綴,而不是0x為前綴)的(在非嚴(yán)格模式中某些實(shí)現(xiàn)是允許八進(jìn)制整數(shù)直接量的)。
在嚴(yán)格模式中,標(biāo)識(shí)符eval和arguments 當(dāng)做關(guān)鍵字,它們的值是不能更改的。不能給這些標(biāo)識(shí)符賦值,也不能把它們聲明為變量、用做函數(shù)名、用做函數(shù)參數(shù)或用做catch塊的標(biāo)識(shí)符。
在嚴(yán)格模式中限制了對(duì)調(diào)用棧的檢測(cè)能力,在嚴(yán)格模式的函數(shù)中,arguments.caller和arguments.callee都會(huì)拋出一個(gè)類型錯(cuò)誤異常。嚴(yán)格模式的函數(shù)同樣具有caller和arguments屬性,當(dāng)訪問這兩個(gè)屬性時(shí)將拋出類型錯(cuò)誤異常(有一些JavaScript的實(shí)現(xiàn)在非嚴(yán)格模式里定義了這些非標(biāo)準(zhǔn)的屬性)
我是Cloudy,年輕的前端攻城獅一枚,愛專研,愛技術(shù),愛分享。
個(gè)人筆記,整理不易,感謝閱讀、點(diǎn)贊和收藏。
文章有任何問題歡迎大家指出,也歡迎大家一起交流前端各種問題!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/105222.html
摘要:整個(gè)腳本文件就會(huì)以嚴(yán)格模式執(zhí)行。函數(shù)作用域范圍將放在函數(shù)體的第一行,則整個(gè)函數(shù)以嚴(yán)格模式運(yùn)行。嚴(yán)格模式下,必須指明的指向?qū)ο蟆=乖诜呛瘮?shù)代碼塊聲明函數(shù)的嚴(yán)格模式只允許在全局作用域或函數(shù)作用域聲明函數(shù)。 ECMAScript 5 引入了 strict mode ,現(xiàn)在已經(jīng)被大多瀏覽器實(shí)現(xiàn)(從IE10開始) 一、什么是嚴(yán)格模式 顧名思義,JavaScript 嚴(yán)格模式就是讓 JS 代碼以...
摘要:嚴(yán)格模式的限制不允許使用未聲明的變量報(bào)錯(cuò)未定義報(bào)錯(cuò)未定義不允許刪除變量或?qū)ο蟆7祷兀驗(yàn)橹赶蛉謱?duì)象,就是返回,因?yàn)閲?yán)格模式下,的值為,所以為。 嚴(yán)格模式優(yōu)勢(shì): 消除Javascript語法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些意外情況出現(xiàn);消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全;提高編譯器效率,增加運(yùn)行速度;注意,同樣的代碼,在嚴(yán)格模式中,可能會(huì)有不一樣的運(yùn)行結(jié)果;一些在正常模...
摘要:一嚴(yán)格模式概述嚴(yán)格模式是什么在中是種限制性更強(qiáng)變種方式,不是個(gè)子集,在語義上與正常代碼有明顯得差異嚴(yán)格模式和非嚴(yán)格模式可共存,可選擇性的加入嚴(yán)格模式嚴(yán)格模式的目的將把陷阱直接變?yōu)槊黠@錯(cuò)誤修正一些引擎難以優(yōu)化錯(cuò)誤,代碼有些時(shí)候嚴(yán)格模式會(huì)比非嚴(yán) JS(JavaScript)一.嚴(yán)格模式1.概述 嚴(yán)格模式是什么 在JS中是種限制性更強(qiáng)變種方式,不是個(gè)子集,在語義上與正常代碼有明顯得差異嚴(yán)格模...
摘要:針對(duì)單個(gè)函數(shù)將放在函數(shù)體的第一行,則整個(gè)函數(shù)以嚴(yán)格模式運(yùn)行。嚴(yán)格模式禁止這種用法,全局變量必須顯式聲明。嚴(yán)格模式下,這屬于語法錯(cuò)誤。嚴(yán)格模式禁止這種表示法,整數(shù)第一位為,將報(bào)錯(cuò)。也就是說,不允許在非函數(shù)的代碼塊內(nèi)聲明函數(shù)。 本文轉(zhuǎn)自【阮一峰博客】:http://www.ruanyifeng.com/blo... 一、概述 除了正常運(yùn)行模式,ECMAscript 5添加了第二種運(yùn)行模式:...
閱讀 1690·2023-04-25 20:16
閱讀 3857·2021-10-09 09:54
閱讀 2706·2021-09-04 16:40
閱讀 2523·2019-08-30 15:55
閱讀 839·2019-08-29 12:37
閱讀 2743·2019-08-26 13:55
閱讀 2913·2019-08-26 11:42
閱讀 3155·2019-08-23 18:26