本篇文章為大家帶來了關於javascript的相關知識,其中主要介紹了關於嚴格模式的相關問題,嚴格模式很好理解,是一種具有限制性的JavaScript模式,從而使代碼隱式的脫離了“懶散模式”,下面一起來看一下,希望對大家有幫助。
【相關推薦:javascript影片教學、web前端】
在ECMAScript5標準中,JavaScript提出了嚴格模式的感念:
嚴格模式很好理解,是一種具有限制性的JavaScript模式,從而使程式碼隱式的脫離了「懶散模式」。
支援嚴格模式的瀏覽器在偵測到程式碼中具有嚴格模式時,會以更嚴格的方式對程式碼進行偵測和執行。
嚴格模式對正常的JavaScript語意做了一些限制:
嚴格模式透過拋出錯誤來消除一些原有的靜默錯誤。
嚴格模式讓JS引擎在執行程式碼時可以進行更多的最佳化(不需要對一些特殊的語法進行處理)。
嚴格模式禁用了在ECMAScript未來版本中可能會定義的一些語法。
那麼如何開啟嚴格模式呢?嚴格模式支援粒度化的遷移:
可以支援在js檔案中開啟嚴格模式;
也支援對某一個函數開啟嚴格模式;
JavaScript被設計成新手開發者更容易上手,所以有時候本買錯誤語法,別認為也是可以正常被解析的;
但是這種方式可能會為帶來留下安全隱患;
在嚴格模式下,這種事務就會被當作錯誤,以便可以快速的發現和修正;
總結了一下幾點常見的限制:
意外的創建全域變數的方式有兩種:
全域不使用關鍵字直接聲明全域變量
在函數內部不使用關鍵字宣告變數函數預設提升為全域變數範例程式碼如下:
'use strict' // 禁止意外創建全域變數message = '意外創建全域變數' console.log(message) // 報錯訊息為:Uncaught ReferenceError: message is not defined function foo () { age = 20 console.log(age) } foo() // ReferenceError: age is not defined
範例程式碼如下:
//開啟嚴格模式,將問題直接轉換為報錯'use strict' const v = 100;//(定義常數) v = 1.14;//重新賦值(為變數) console.log(v); // Uncaught TypeError: Assignment to constant variable.
嚴格模式下,不能對變數使用delect運算子。
// 開啟嚴格模式'use strict' var v = 100; delete v;//非嚴格模式下:此處為靜默失敗,既沒有報錯也沒有刪除變數v console.log(v);//100 //開啟嚴格模式後,改為錯誤Delete of an unqualified identifier in strict mode.
嚴格模式下對陣列和對方法屬性使用delete關鍵字,效果不變。
// 開啟嚴格模式'use strict' // 1.嚴格模式下刪除陣列內容var arr = [1,2,3,4] delete arr[0]; console.log(arr);//[ <1 empty item>, 2, 3, 4 ] // 2、嚴格模式下delete函數的屬性var obj = { name : '豬豬俠 ' } delete obj.name; console.log(obj.name)//undefined
範例程式碼如下:
'use strict' // 不允許函數有相同的參數名稱function foo2 (x, y, x) { console.log(x, y, x) } foo2(10, 20, 30) // SyntaxError: Duplicate parameter name not allowed in this context
範例程式碼如下:
// 不允許使用原先的八進位格式var num1 = 0123 var num2 = 0o123 // 可以寫成這種格式八進位var num3 = 0x123 // 可以寫成這種格式十六進位var num4 = 0b100 // 可以寫成這種格式二進位console.log(num1) // SyntaxError: Octal literals are not allowed in strict mode. console.log(num2, num3, num4) // 83 291 4
範例程式碼如下:
'use strict' var message = 'Hello World'; var obj = { name: 'jam', age: 20 } // with語句可以形成自己的作用域,在with語句中列印age時,會輸出obj物件中的age屬性,但在with語句中列印不存在的屬性message時,會向外層的作用域一層一層去查找function foo () { with (obj) { console.log(age) console.log(message) } console.log(message) } foo() // SyntaxError: Strict mode code may not include a with statement
範例程式碼如下:
var jsString = "var message = 'hello world';console.log(message)" eval(jsString) // 輸出 hello world console.log(message) // 報錯訊息為:ReferenceError: message is not defined
开启严格模式eval函数不会向上引用变量所以全局作用域就没有message这个变量所以会报错
範例程式碼如下:
'use strict' // 在嚴格模式下,自執行函數(預設綁定)會指向undefined ,非嚴格模式下會指向window function foo () { console.log(this) } foo() // undefined