当前位置: 面试刷题>> JS 代码中的 use strict 是什么?有什么作用?


在JavaScript的世界里,use strict 是一种声明,用于告诉JavaScript引擎采用更严格的解析和错误处理模式。这一特性自ECMAScript 5 (ES5) 起被引入,旨在帮助开发者写出更清晰、更安全、更易于管理的代码。作为一名高级程序员,理解和应用 use strict 是提升代码质量和可维护性的重要一步。

use strict 的作用

  1. 防止意外的全局变量:在严格模式下,如果你尝试在全局作用域中声明一个未使用 varletconst 的变量,JavaScript 引擎将抛出一个错误,而不是默默地创建一个全局变量。这有助于避免全局命名空间的污染,减少潜在的bug。

    "use strict";
    x = 1; // 这将抛出ReferenceError
    var y = 2; // 正确
    
  2. 禁止删除不可删除的属性:在严格模式下,尝试删除不可配置(non-configurable)的属性会抛出TypeError,而在非严格模式下则静默失败。

    "use strict";
    var obj = {};
    Object.defineProperty(obj, 'a', { value: 1, configurable: false });
    delete obj.a; // 抛出TypeError
    
  3. 禁止重名属性:在对象字面量中,严格模式禁止重复的属性名,而在非严格模式下,后面的属性会覆盖前面的属性。

    "use strict";
    var obj = {
        prop: 1,
        prop: 2 // 抛出SyntaxError
    };
    
  4. 禁止八进制字面量:在严格模式下,八进制字面量(以0开头表示)会被视为语法错误,因为八进制容易引起混淆和错误。

    "use strict";
    var num = 010; // 抛出SyntaxError
    var num = 10; // 正确
    
  5. 禁止with语句with 语句由于其可能引起的作用域混乱,在严格模式下被禁止使用。

    "use strict";
    with (Math) {
        x = cos(2); // 抛出SyntaxError
    }
    
  6. 限制eval的作用域:在严格模式下,eval 函数不会在其作用域内引入新的变量,也不会修改调用者的作用域。

    "use strict";
    eval("var x = 2;");
    console.log(x); // 抛出ReferenceError
    
  7. 禁止函数声明在非函数代码块内:在严格模式下,如果你尝试在if语句、循环或任何非函数代码块内声明函数,将会抛出SyntaxError。

    "use strict";
    if (true) {
        function f() {} // 抛出SyntaxError
    }
    
  8. 使this的值更加严格:在严格模式下,全局环境中的this不再指向全局对象(在浏览器中是window),而是undefined。在函数体内,如果函数不是作为方法被调用,this同样会保持为undefined,这有助于避免一些常见的错误。

    "use strict";
    function f() {
        return this;
    }
    console.log(f() === undefined); // true
    

示例代码与整合

结合以上几点,以下是一个使用 use strict 的示例代码片段,展示了其如何帮助提升代码质量:

(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技能能够稳步提升。

推荐面试题