当前位置: 面试刷题>> JS 代码中的 use strict 是什么?有什么作用?
在JavaScript的世界里,`use strict` 是一种声明,用于告诉JavaScript引擎采用更严格的解析和错误处理模式。这一特性自ECMAScript 5 (ES5) 起被引入,旨在帮助开发者写出更清晰、更安全、更易于管理的代码。作为一名高级程序员,理解和应用 `use strict` 是提升代码质量和可维护性的重要一步。
### `use strict` 的作用
1. **防止意外的全局变量**:在严格模式下,如果你尝试在全局作用域中声明一个未使用 `var`、`let` 或 `const` 的变量,JavaScript 引擎将抛出一个错误,而不是默默地创建一个全局变量。这有助于避免全局命名空间的污染,减少潜在的bug。
```javascript
"use strict";
x = 1; // 这将抛出ReferenceError
var y = 2; // 正确
```
2. **禁止删除不可删除的属性**:在严格模式下,尝试删除不可配置(non-configurable)的属性会抛出TypeError,而在非严格模式下则静默失败。
```javascript
"use strict";
var obj = {};
Object.defineProperty(obj, 'a', { value: 1, configurable: false });
delete obj.a; // 抛出TypeError
```
3. **禁止重名属性**:在对象字面量中,严格模式禁止重复的属性名,而在非严格模式下,后面的属性会覆盖前面的属性。
```javascript
"use strict";
var obj = {
prop: 1,
prop: 2 // 抛出SyntaxError
};
```
4. **禁止八进制字面量**:在严格模式下,八进制字面量(以0开头表示)会被视为语法错误,因为八进制容易引起混淆和错误。
```javascript
"use strict";
var num = 010; // 抛出SyntaxError
var num = 10; // 正确
```
5. **禁止`with`语句**:`with` 语句由于其可能引起的作用域混乱,在严格模式下被禁止使用。
```javascript
"use strict";
with (Math) {
x = cos(2); // 抛出SyntaxError
}
```
6. **限制`eval`的作用域**:在严格模式下,`eval` 函数不会在其作用域内引入新的变量,也不会修改调用者的作用域。
```javascript
"use strict";
eval("var x = 2;");
console.log(x); // 抛出ReferenceError
```
7. **禁止函数声明在非函数代码块内**:在严格模式下,如果你尝试在if语句、循环或任何非函数代码块内声明函数,将会抛出SyntaxError。
```javascript
"use strict";
if (true) {
function f() {} // 抛出SyntaxError
}
```
8. **使`this`的值更加严格**:在严格模式下,全局环境中的`this`不再指向全局对象(在浏览器中是`window`),而是`undefined`。在函数体内,如果函数不是作为方法被调用,`this`同样会保持为`undefined`,这有助于避免一些常见的错误。
```javascript
"use strict";
function f() {
return this;
}
console.log(f() === undefined); // true
```
### 示例代码与整合
结合以上几点,以下是一个使用 `use strict` 的示例代码片段,展示了其如何帮助提升代码质量:
```javascript
(function() {
"use strict";
// 尝试一些严格模式下的操作
try {
eval("var x = 10;");
console.log(x); // 实际上这里会抛出ReferenceError,因为x在外部作用域不可见
} catch (e) {
console.error("Eval failed:", e);
}
var obj = {
prop: 1
};
// 尝试修改不可配置的属性
try {
Object.defineProperty(obj, 'prop', { value: 2, configurable: false });
delete obj.prop; // 抛出TypeError
} catch (e) {
console.error("Cannot delete property:", e);
}
// 正确的使用方式
function safeFunction() {
"use strict";
// 函数体...
return this; // 在非方法调用时,这里将是undefined
}
console.log(safeFunction() === undefined); // true
})();
```
通过在实际开发中坚持使用 `use strict`,开发者可以享受到更加清晰、更加安全的代码环境,同时也有助于提升代码的可读性和可维护性。在`码小课`的网站上,我们鼓励学习者从一开始就养成良好的编程习惯,包括使用 `use strict`,以确保他们的JavaScript技能能够稳步提升。