摘要:嚴(yán)格模式和非嚴(yán)格模式有什么區(qū)別嚴(yán)格模式對正常的語義做了一些更改。其次,嚴(yán)格模式修復(fù)了一些導(dǎo)致引擎難以執(zhí)行優(yōu)化的缺陷有時候,相同的代碼,嚴(yán)格模式可以比非嚴(yán)格模式下運行得更快。
嚴(yán)格模式和非嚴(yán)格模式有什么區(qū)別:
嚴(yán)格模式對正常的 JavaScript語義做了一些更改。
首先,嚴(yán)格模式通過拋出錯誤來消除了一些原有靜默錯誤。
其次,嚴(yán)格模式修復(fù)了一些導(dǎo)致 JavaScript引擎難以執(zhí)行優(yōu)化的缺陷:有時候,相同的代碼,嚴(yán)格模式可以比非嚴(yán)格模式下運行得更快。
第三,嚴(yán)格模式禁用了在ECMAScript的未來版本中可能會定義的一些語法。
上文引用了MDN對嚴(yán)格模式的描述
1.變量必須聲明才能使用(在正常模式中,如果一個變量沒有聲明就賦值,默認是全局變量。嚴(yán)格模式禁止這種寫法)
2.禁止使用with語句(因為with語句無法在編譯時就確定,屬性到底歸屬于哪個對象,嚴(yán)格模式有利于編譯效率提高)
3.創(chuàng)建eval作用域(正常模式下,js有兩種變量作用域,全局作用域和局部作用域,正常模式下eval語句作用域取決于它處于全局作用域還是函數(shù)作用域,嚴(yán)格模式下eval語句本身就是作用域,不能夠生成全局變量,所生成的變量只能用于eval內(nèi)部)
4.禁止this關(guān)鍵字指向全局對象(嚴(yán)格模式下全局作用域中定義的函數(shù)中的this為undefined)。例如:
function f(){ return !this; //返回的是false,因為this指向的是全局對象,!對象 == false } function f(){ "use strict" return !this; //返回的是true,因為嚴(yán)格模式下,this的值為undefined,!undefined == true }
5.禁止在函數(shù)內(nèi)部遍歷調(diào)用棧( caller:調(diào)用當(dāng)前函數(shù)的函數(shù)的引用,即外層函數(shù)的引用; )
function f1(){ "use strict"; f1.caller; //報錯 f1.arguments; //報錯 } f1();
6.嚴(yán)格模式下無法刪除變量。只有conifgurable設(shè)置為true的對象屬性才能被刪除
"use strict" var x ; delete x; //嚴(yán)格模式下報語法錯誤 var o = Object.create(null,{"x":{ value: 1, configurable: true }}) delete o.x; //刪除成功
7.顯示報錯(正常模式下對一個對象的只讀屬性進行賦值,不會報錯,只會默默失敗。嚴(yán)格模式下將報錯)
"use strict"; var o = {}; Object.defineProperty(o,"v",{value: 1,writable: false}); o.v = 2; //報錯,因為o.v屬性是不能被修改的,嚴(yán)格模式會報錯,正常模式會失敗但不報錯
8.嚴(yán)格模式下,對禁止擴展的對象添加新屬性,會報錯
"use strict"; var o = {}; Object.preventExtensions(o);//禁止o對象有拓展屬性 o.v = 1; //報錯
9.嚴(yán)格模式下,刪除一個不可刪除的屬性,報錯
"use strict"; delete Object.prototype; //報錯
10.對象擁有多個同名屬性,嚴(yán)格模式報錯。正常模式會默認值為最后一個
11.函數(shù)不能有重名的參數(shù),嚴(yán)格模式會報錯,正常模式可以通過arguments[i]來獲取對應(yīng)的參數(shù)
12.禁止八進制寫法,正常情況下整數(shù)第一位為0代表八進制,嚴(yán)格模式下整數(shù)第一位為0則報錯
13.不準(zhǔn)對arguments賦值
14.嚴(yán)格模式下的arguments不在追蹤參數(shù)的變化
function fn(a){ a=2; return [a,arguments[0]]; } fn(1); //正常模式返回值 [2,2] "use strict" function fn(a){ a = 2; return [a,arguments[0]]; } fn(1); //嚴(yán)格模式返回值 [2,1] 參數(shù)傳進來是多少就是多少,arguments不會變化
15.禁止使用arguments.callee(無法在匿名函數(shù)內(nèi)部調(diào)用自身了。arguments.callee指向的就是該函數(shù)本身)
var f = function (){ return arguments.callee; } f(); //報錯
總結(jié):推薦使用嚴(yán)格模式,因為能讓代碼更規(guī)范,也更利于后期的維護和排除錯誤。更加嚴(yán)謹(jǐn)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96337.html
摘要:作為構(gòu)造函數(shù)何為構(gòu)造函數(shù)所謂構(gòu)造函數(shù)就是用來對象的函數(shù),像等都是全局定義的構(gòu)造函數(shù)。正在跑步正在說話正在跑步正在說話如上,如果函數(shù)作為構(gòu)造函數(shù)用,那么其中的就代表它即將出來的對象。 前言 總括:詳解JavaScript中的this的一篇總結(jié),不懂this這個難點,很多時候會造成一些困擾,寫出一些bug不知如何收場,所以一起來寫bug吧,不對,一起來寫代碼吧。 原文地址:JavaScr...
摘要:和都是循環(huán)語句,不同的是檢測表達式的位置。語句異常語句,所謂異常語句是發(fā)生異?;蝈e誤的一個標(biāo)志或信號。拋出異常就是指這個狀況,捕獲異常實是指處理的過程。語句異常處理機制。語句嚴(yán)格模式中禁止使用語句。 1.switch語句 語句都很熟悉的啦,只是提一句。switch中的case語句匹配的規(guī)則實際上是===而非簡單的==比較,case匹配不會做任何的類型轉(zhuǎn)換的。 2.while和do/wh...
摘要:第二種情況是箭頭函數(shù)的如果指向普通函數(shù)它的繼承于該普通函數(shù)。箭頭函數(shù)的指向全局,使用會報未聲明的錯誤。 showImg(https://segmentfault.com/img/remote/1460000018610072?w=600&h=400); 箭頭函數(shù)是ES6的API,相信很多人都知道,因為其語法上相對于普通函數(shù)更簡潔,深受大家的喜愛。就是這種我們?nèi)粘i_發(fā)中一直在使用的API...
摘要:在嚴(yán)格模式中,當(dāng)運算符后跟隨非法的標(biāo)識符比如變量函數(shù)函數(shù)參數(shù)時,將會拋出一個語法錯誤異常在非嚴(yán)格模式中,這種表達式什么也沒做,并返回。 JavaScript之use strict use strict是ECMAScript 5引入的一條指令。指令不是語句(但非常接近于語句)。usestrict指令和普通的語句之間有兩個重要的區(qū)別: 它不包含任何語言的關(guān)鍵字,指令僅僅是一個包含一個特殊...
摘要:把這個執(zhí)行上下文壓入調(diào)用棧的頂部,即設(shè)置成運行執(zhí)行上下文。函數(shù)作為構(gòu)造函數(shù)調(diào)用沒有繼承關(guān)系有繼承關(guān)系我們把一個函數(shù)被當(dāng)作構(gòu)造函數(shù),使用操作符調(diào)用時發(fā)生的主要步驟新建一個普通對象,把其原型指向構(gòu)造函數(shù)的屬性的值。把當(dāng)前執(zhí)行上下文彈出調(diào)用棧。 var currentTime = Date() 能生成一個當(dāng)前時間的日期對象,var currentTime = new Date() 也能生成一...
閱讀 3068·2021-09-22 15:59
閱讀 1319·2021-08-30 09:46
閱讀 2281·2019-08-30 15:54
閱讀 2021·2019-08-26 12:15
閱讀 2547·2019-08-26 12:09
閱讀 1346·2019-08-26 11:57
閱讀 3344·2019-08-23 17:11
閱讀 1893·2019-08-23 15:59