当前位置: 面试刷题>> 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技能能够稳步提升。
推荐面试题