JavaScript - 严格模式
JavaScript 中的严格模式
在 JavaScript 中,严格模式 (Strict Mode)是在 ES5 (ECMAScript 2009) 中引入的。引入"严格模式"的目的是为了提高 JavaScript 代码的安全性。
使用 `use strict` 字面表达式可以在 JavaScript 代码中添加严格模式。它可以消除代码中的隐含错误,例如无法使用未声明的变量,无法修改对象的可读属性等等。
启用严格模式
要启用严格模式,您需要在代码顶部写入以下字面表达式 -
'use strict';
"use strict"指令用于启用 JavaScript 的严格模式。
为什么使用严格模式?
这里,我们列出了使用严格 JavaScript 模式的一些原因 -
- 错误预防 - 严格模式可以防止开发人员在编写 JavaScript 代码时犯的常见错误,例如未经声明就初始化变量或使用保留关键字作为标识符。
- 更安全的代码 - 严格模式可以防止意外创建全局变量。此外,它不允许使用像"with"这样的语句,这可能会导致代码漏洞。
- 未来兼容性 - 您可以使用脚本模式使您的代码与 JavaScript 的未来版本保持一致。例如,当前版本的 JavaScript 不包含像"public"这样的关键字,但这些关键字是为未来版本保留的。因此,从现在起,严格模式将不允许您将其用作标识符。
全局范围内的严格模式
当您在 JavaScript 代码顶部添加"use strict"时,它将对整个代码使用严格模式。
示例
在下面的示例中,我们定义了"y"变量,并用 50 对其进行了初始化。代码在输出中打印了"y"的值。
此外,我们初始化了变量"x",但没有声明它。因此,它在控制台中给出了错误,并且没有打印输出。
简而言之,严格模式不允许您在未声明的情况下使用变量。
<html>
<head>
<title> Using the strict mode gloablly </title>
</head>
<body>
<script>
"use strict";
let y = 50; // This is valid
document.write("The value of the X is: " + y);
x = 100; // 这是无效的
document.write("The value of the X is: " + x);
</script>
</body>
</html>
局部作用域中的严格模式
您也可以在特定函数内部使用"严格模式"。因此,它只会在函数作用域内生效。让我们通过一个例子来理解它。
示例
在下面的例子中,我们仅在 test() 函数内部使用了"use strict"字面量。因此,它只会移除函数内部的异常错误。
以下代码允许您初始化变量,而无需在函数外部声明它,而无需在函数内部声明它。
<html>
<head>
<title> Using the strict mode gloablly </title>
</head>
<body>
<script>
x = 100; // This is valid
document.write("The value of the X is - " + x);
function test() {
"use strict";
y = 50; // 这是无效的
document.write("The value of the y is: " + x);
}
test();
</script>
</body>
</html>
在严格模式下不应犯的错误
1. 未声明变量时,无法为其初始化值。
<script> 'use strict'; num = 70.90; // 这是无效的 </script>
2. 同样,如果不声明对象,则无法使用它。
<script>
'use strict';
numObj = {a: 89, b: 10.23}; // 这是无效的
</script>
3. 不能使用 delete 关键字删除对象。
<script>
'use strict';
let women = { name: "Aasha", age: 29 };
delete women; // 这是无效的
</script>
4. 严格模式下不能删除对象原型。
<script>
'use strict';
let women = { name: "Aasha", age: 29 };
delete women.prototype; // 这是无效的
</script>
5. 不允许使用 delete 运算符删除函数。
<script>
'use strict';
function func() { }
delete func; // 这是无效的
</script>
6. 函数不能有重复的参数值。
<script>
'use strict';
function func(param1, param1, param2) {
// 不允许使用具有 2 个参数的函数!
}
</script>
7. 不能将八进制数赋给变量。
<script> 'use strict'; let octal = 010; // Throws an error </script>
8. 不能使用转义字符。
<script> 'use strict'; let octal = \010; // Throws an error </script>
9. 不能使用保留关键字(例如 eval、arguments、public 等)作为标识符。
<script> 'use strict'; let public = 100; // Throws an error </script>
10. 您无法写入对象的可读属性。
<script>
'use strict';
let person = {};
Object.defineProperty(person, 'name', { value: "abc", writable: false });
obj1.name = "JavaScript"; // throws an error
</script>
11. 不能为 getters 函数赋值。
<script>
'use strict';
let person = { get name() { return "JavaScript"; } };
obj1.name = "JavaScript"; // throws an error
</script>
12. 在严格模式下,当在函数内部使用 this 关键字时,它指向调用该函数的引用对象。如果未指定引用对象,则指向 undefined 值。
<script>
'use strict';
function test() {
console.log(this); // Undefined
}
test();
</script>
13. 严格模式下不能使用 'with' 语句。
<script>
'use strict';
with (Math) {x = sin(2)}; // 这将引发错误
</script>
14. 出于安全原因,您不能使用 eval() 函数声明变量。
<script>
'use strict';
eval("a = 8")
</script>
15. 您不能使用保留的关键字作为标识符。以下关键字是保留的,供将来使用 -
- implements
- interface
- package
- private
- protected

