Javascript 简明教程
JavaScript - Strict Mode
Strict Mode in JavaScript
在 JavaScript 中, strict mode 在 ES5(ECMAScript 2009)中引入。引入“严格模式”的目的是让 JavaScript 代码更安全。
“@ {s0}” 是 JavaScript 代码中用来添加严格模式的语法常量。它可以从代码中移除静默错误,例如,在未声明变量的情况下就使用变量,无法修改对象的只读属性等。
Why Use the Strict Mode?
以下是使用 JavaScript 严格模式的几点原因:
-
Error Prevention - 严格模式可以防止开发者在编写 JavaScript 代码时,出现的常见错误,例如,在未声明变量的情况下,就对变量进行初始化,或者将保留字用作标识符。
-
Safer Code - 严格模式禁止意外创建全局变量。另外,它禁止使用 “with” 等语句,因为该语句容易导致代码出现漏洞。
-
Future Compatibility - 通过使用脚本模式,可以将代码与 JavaScript 未来版本进行对齐。例如,当前版本的 JavaScript 不包含 “public” 等关键字,但该关键字是为未来版本保留的。因此,从现在开始,严格模式将不允许将其用作标识符。
Strict Mode in the Global Scope
在 JavaScript 代码顶部添加 “@ {s4}” 时;它对整个代码都使用了严格模式。
Example
在下面的示例中,我们定义了变量“y”,并将其初始化为 50。该代码在输出中打印 “y” 的值。
另外,我们初始化了变量 “x”,而没有对其进行声明。因此,它在控制台中显示了 error ,并不会打印输出。
简而言之,严格模式不允许在未声明变量的情况下就使用该变量。
<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; // This is not valid
document.write("The value of the X is: " + x);
</script>
</body>
</html>
Strict Mode in the Local Scope
你还可以将 “严格模式” 用于特定函数中。所以,它只会在函数作用域中生效。我们通过一个示例来理解这一点。
Example
在下面的示例中,只在 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; // This is not valid
document.write("The value of the y is: " + x);
}
test();
</script>
</body>
</html>
Mistakes that you should’t make in the strict mode
-
在未声明变量的情况下,无法用值对该变量进行初始化。
<script>
'use strict';
num = 70.90; // This is invalid
</script>
-
类似地,你无法在不对其进行声明的情况下就使用对象。
<script>
'use strict';
numObj = {a: 89, b: 10.23}; // This is invalid
</script>
-
无法使用 delete 关键字删除对象。
<script>
'use strict';
let women = { name: "Aasha", age: 29 };
delete women; // This is invalid
</script>
-
在严格模式下,无法删除对象原型。
<script>
'use strict';
let women = { name: "Aasha", age: 29 };
delete women.prototype; // This is invalid
</script>
-
不允许使用 delete 操作符删除函数。
<script>
'use strict';
function func() { }
delete func; // This is invalid
</script>
-
参数值不能为重复。
<script>
'use strict';
function func(param1, param1, param2) {
// Function with 2 param1 is not allowed!
}
</script>
-
不能将八进制数赋值给变量。
<script>
'use strict';
let octal = 010; // Throws an error
</script>
-
不能使用转义字符。
<script>
'use strict';
let octal = \010; // Throws an error
</script>
-
不能将 eval、arguments、public 等保留关键字用作标识符。
<script>
'use strict';
let public = 100; // Throws an error
</script>
-
不能写入对象的只读属性。
<script>
'use strict';
let person = {};
Object.defineProperty(person, 'name', { value: "abc", writable: false });
obj1.name = "JavaScript"; // throws an error
</script>
-
不能将值赋值给 getters 函数。
<script>
'use strict';
let person = { get name() { return "JavaScript"; } };
obj1.name = "JavaScript"; // throws an error
</script>
-
在严格模式下,当函数内部使用“this”关键字时,它引用了通过该函数调用的引用对象。如果未指定引用对象,则它引用 undefined 值。
<script>
'use strict';
function test() {
console.log(this); // Undefined
}
test();
</script>
-
在严格模式下不能使用“with”语句。
<script>
'use strict';
with (Math) {x = sin(2)}; // This will throw an error
</script>
-
出于安全原因,不能使用 eval() 函数声明变量。
<script>
'use strict';
eval("a = 8")
</script>
-
不能将作为保留的关键字用作标识符。以下关键字为将来保留:[style="arabic"]
-
implements
-
interface
-
package
-
private
-
protected
-