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