嚴格模式使得 JavaScript 對某些可能的問題拋出錯誤,而在非嚴格模式下,這些問題可能會被忽略。例如,未聲明的變量(即全局變量)在非嚴格模式下會被隱式地創建為全局變量,而在嚴格模式下會拋出錯誤。(例子如下:)
非嚴格模式:
// 未聲明的變量在非嚴格模式下不會拋出錯誤
var x = y; // y 未聲明,但不會被報錯嚴格模式:
"use strict";
// 嚴格模式下,未聲明的變量會拋出錯誤
var x = y; // ReferenceError: y is not defined
在嚴格模式下,變量必須在使用之前聲明。否則,會拋出引用錯誤。這有助于防止使用未聲明的變量,從而減少潛在的錯誤(例子如下:)
非嚴格模式:
// 在使用變量之前未聲明,在非嚴格模式下不會報錯
function example() { x = 10; var x;
}
嚴格模式:
// 嚴格模式下,在使用變量之前未聲明會拋出錯誤
"use strict";
function example() { x = 10; // ReferenceError: x is not defined var x;
}
在嚴格模式下,重復的屬性名稱或參數名稱在對象字面量或函數參數列表中會導致語法錯誤。這有助于捕獲可能的錯誤和不一致性。(例子如下:)
// 非嚴格模式下,重復的屬性名稱不會拋出錯誤
var obj = { a: 1, a: 2
};
console.log(obj.a); // 輸出 2// 嚴格模式下,重復的屬性名稱會拋出錯誤
"use strict";
var obj = { a: 1, a: 2 // SyntaxError: Duplicate data property in object literal not allowed in strict mode
};
在嚴格模式下,函數聲明必須在代碼塊的頂部,否則會導致語法錯誤。這有助于保持代碼的可讀性和一致性。(例子如下:)
非嚴格模式下,函數聲明可以在代碼塊中間
if (true) { function example() { console.log("Hello"); }
}
example(); // 輸出 "Hello"嚴格模式下,函數聲明必須在代碼塊頂部
"use strict";
if (true) { function example() { // SyntaxError: Function declaration not allowed in strict mode console.log("Hello"); }
}
在嚴格模式下,this 關鍵字的值在函數調用時始終為 undefined(除非該函數是對象的方法)。這有助于減少關于 this 關鍵字行為的混淆。(例子如下:)
非嚴格模式下,函數內的this可能不指向全局對象
function example() { console.log(this);
}
example(); // 輸出全局對象,通常是 window嚴格模式下,函數內的this在函數調用時始終為undefined
"use strict";
function example() { console.log(this); // undefined
}
example();
在嚴格模式下,嘗試刪除變量、函數或函數參數會拋出錯誤。這有助于防止意外地修改代碼的狀態。(例子如下:)
非嚴格模式下,可以刪除變量
var x = 10;
delete x; // 在非嚴格模式下不會拋出錯誤,但x仍然存在嚴格模式下,嘗試刪除變量會拋出錯誤
"use strict";
var x = 10;
delete x; // TypeError: Cannot delete property 'x' of #<Object>
在嚴格模式下,八進制字面量會導致語法錯誤。這有助于防止使用可能導致混淆的八進制表示法。(例子如下:)
非嚴格模式下,八進制字面量有效
var num = 010; // 等于 8嚴格模式下,八進制字面量會拋出錯誤
"use strict";
var num = 010; // SyntaxError: Octal literals are not allowed in strict mode.
在嚴格模式下,eval() 函數的作用域限制在調用它的函數內部,而不是全局作用域。這有助于減少 eval() 函數可能帶來的安全風險。(例子如下:)
非嚴格模式下,eval() 的作用域是全局作用域
var x = 20;
function testEval() { var x = 10; eval("console.log(x);"); // 輸出 20,因為使用的是全局變量 x
}
testEval();嚴格模式下,eval() 的作用域限制在調用它的函數內部
"use strict";
var x = 20;
function testEval() { var x = 10; eval("console.log(x);"); // 輸出 10,因為使用的是函數內部的 x
}
testEval();