JavaScript 中的“use strict”有什麼作用,其背後的原因是什麼?
在本教程中,我們將學習 JavaScript 中“use strict”的作用。
“use strict”是一個指令。它起源於 JavaScript 1.8.5。
use strict 指令規定 JavaScript 程式碼必須在嚴格模式下執行。嚴格模式指令不是語句,而是一個常量表達式。早期的 JavaScript 版本會忽略此表示式。
在嚴格模式下編寫程式碼時,我們不能使用未宣告的變數。除了 IE9 及以下版本,所有現代瀏覽器都支援此 JavaScript 指令。嚴格模式允許我們編寫更簡潔的程式碼,因為它會在程式中使用未宣告的變數時丟擲錯誤。
“use strict”是一個字串。要啟用嚴格模式,我們需要將此字串寫在指令碼的開頭。寫在開頭意味著它具有全域性作用域。
使用此 JavaScript 指令的優點是我們可以獲得安全的程式碼。早期的 JavaScript 版本會忽略錯誤的語法。例如,以前,錯誤鍵入的變數名會變成全域性變數。在嚴格模式下,它會為此變數丟擲錯誤,我們可以糾正它。JavaScript 函式在必要時也會使用嚴格模式。
使用者可以按照以下語法使用此方法。
語法
"use strict"; const a = "Strict Variable";
此處,語法中的第一行是指令,a 是遵循嚴格模式的變數。
示例 1
此程式在普通模式下有一個未宣告的變數 q,在嚴格模式下有一個未宣告的變數 p。在非嚴格模式下,我們可以顯示 q 的值。當用戶選擇嚴格模式時,我們無法顯示 p 的值;相反,它會在 catch 塊中丟擲錯誤。
<html> <body> <h2>Using JavaScript strict mode</h2> <p id = "strictModInp"></p> <div id = "strictModOutWrap"> <h3>Click this button to strict mode</h3> <button id = "strictModBtn" onclick = "getStrictMode();">Be Strict </button> </div> <p id = "strictModOut"></p> <script> var strictModEl; var strictModData; var strictModWrap = document.getElementById("strictModOutWrap"); function getStrictMode() { "use strict"; try { p = 10; strictModData = "Undeclared variable in strict mode -
" + p; } catch(e) { strictModData = "Undeclared variable in strict mode -
" + e; } strictModEl = document.getElementById("strictModOut"); strictModEl.innerHTML = strictModData; // strictModWrap.style.display = "none"; } function noStrict() { q = 10; strictModEl = document.getElementById("strictModInp"); strictModData = "Undeclared variable in normal mode -
" + q; strictModEl.innerHTML = strictModData; } noStrict(); </script> </body> </html>
示例 2
此程式有四個嚴格模式會丟擲錯誤的情況。我們使用 try-catch 塊將此錯誤顯示給使用者。您可以參考程式下面內聯的每個情況註釋。
<html> <body> <h2>Using the JavaScript strict mode restriction cases.</h2> <p id = "useStrictInp"></p> <div id = "useStrictOutWrap"> <h5>Click this button to strict mode</h5> <button id = "useStrictBtn" onclick="strictUse();"> Strict </button> </div> <p id = "useStrictOut"> </p> <script> var useStrictEl; var useStrictData; var useStrictWrap = document.getElementById("useStrictOutWrap"); var useStrictOut = document.getElementById("useStrictOut"); var useStrictErr = ""; function strictMode(option) { 'use strict'; try { switch(option) { case 1: //must declare a variable a = 'hi'; break; case 2://must declare an object jsonObj = {name: 'Carla', age: 25}; break; case 3://must not assign to the non-writable property let obj1 = {}; Object.defineProperty(obj1, 'x', { value: 40, writable: false }); obj1.x = 10; break; case 4://must not assign to a getter-only property let obj2 = { get x() { return 10; } }; obj2.x = 5; break; } } catch(e) { useStrictErr += e + "<br><br>"; } useStrictOut.innerHTML = useStrictErr; } function strictUse() { strictMode(1); strictMode(2); strictMode(3); strictMode(4); } </script> </body> </html>
嚴格模式中的其他限制
我們不能賦值給變數“arguments”
'use strict'; let arguments = 'hello'; //error let eval = 44;
我們不能使用八進位制值
'use strict'; let a = 010; //error
我們不能使用跳脫字元
'use strict'; let a = \010; //error
我們不能為不可擴充套件的物件分配新屬性
'use strict'; let obj = {}; Object.preventExtensions(obj); obj.newKey = 'test'; //error
我們不能使用重複的引數
"use strict"; function hello(p1, p1) { console.log('hello') }; //error hello();
我們不能刪除物件
'use strict'; let person = {name: 'Egan'}; delete person; //error
我們不能使用未宣告的變數
"use strict"; var x = 1; //valid y = 1;//invalid
我們不能使用關鍵字
"use strict"; var for = 1; //error var if = 1;
我們不能賦值給只讀物件
"use strict"; var arr = [10,20,30]; arr.length = 10;
我們不能使用“with”
"use strict"; with (Math) { x = abs(200.234, 2); //error };
我們不能使用“eval”
"use strict"; eval("var x = 1");
函式內的嚴格模式
x = 1; //valid function sum(val1, val2) { "use strict"; result = val1 + val2;//error return result; }
我們不能刪除原型
"use strict"; delete Object.prototype;
我們不能刪除未限定的識別符號。
"use strict"; function f(a, b) { delete(a); //error }
我們不能刪除未限定的識別符號、函式或物件
"use strict"; var x = 50; var obj = { 'name': 'name' }; function f() { } delete x; //error delete obj; //error delete f; //error,
要在某些控制檯中使用嚴格模式,請使用此程式碼塊
(function() { 'use strict'; //code here... })()
在本教程中,我們學習了 JavaScript 中的嚴格模式,它限制了未宣告變數的使用。使用嚴格模式,我們可以確保程式碼安全和簡潔。嚴格模式很有用,因為它可以防止錯誤。