Javascript 简明教程

JavaScript - Strict Mode

Strict Mode in JavaScript

在 JavaScript 中, strict mode 在 ES5(ECMAScript 2009)中引入。引入“严格模式”的目的是让 JavaScript 代码更安全。

“@ {s0}” 是 JavaScript 代码中用来添加严格模式的语法常量。它可以从代码中移除静默错误,例如,在未声明变量的情况下就使用变量,无法修改对象的只读属性等。

Enabling Strict Mode

要启用严格模式,应在代码顶部写入以下语法常量:

'use strict';

“use strict” 指令用于启用 JavaScript 的严格模式。

Why Use the Strict Mode?

以下是使用 JavaScript 严格模式的几点原因:

  1. Error Prevention - 严格模式可以防止开发者在编写 JavaScript 代码时,出现的常见错误,例如,在未声明变量的情况下,就对变量进行初始化,或者将保留字用作标识符。

  2. Safer Code - 严格模式禁止意外创建全局变量。另外,它禁止使用 “with” 等语句,因为该语句容易导致代码出现漏洞。

  3. 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

  1. 在未声明变量的情况下,无法用值对该变量进行初始化。

<script>
   'use strict';
   num = 70.90; // This is invalid
</script>
  1. 类似地,你无法在不对其进行声明的情况下就使用对象。

<script>
   'use strict';
   numObj = {a: 89, b: 10.23}; // This is invalid
</script>
  1. 无法使用 delete 关键字删除对象。

 <script>
   'use strict';
   let women = { name: "Aasha", age: 29 };
   delete women; // This is invalid
</script>
  1. 在严格模式下,无法删除对象原型。

 <script>
   'use strict';
   let women = { name: "Aasha", age: 29 };
   delete women.prototype; // This is invalid
</script>
  1. 不允许使用 delete 操作符删除函数。

 <script>
   'use strict';
   function func() { }
   delete func; // This is invalid
</script>
  1. 参数值不能为重复。

<script>
   'use strict';
   function func(param1, param1, param2) {
      // Function with 2 param1 is not allowed!
   }
</script>
  1. 不能将八进制数赋值给变量。

<script>
   'use strict';
   let octal = 010; // Throws an error
</script>
  1. 不能使用转义字符。

<script>
   'use strict';
   let octal = \010; // Throws an error
</script>
  1. 不能将 eval、arguments、public 等保留关键字用作标识符。

<script>
   'use strict';
   let public = 100; // Throws an error
</script>
  1. 不能写入对象的只读属性。

<script>
    'use strict';
    let person = {};

    Object.defineProperty(person, 'name', { value: "abc", writable: false });
    obj1.name = "JavaScript"; // throws an error
</script>
  1. 不能将值赋值给 getters 函数。

<script>
   'use strict';
   let person = { get name() { return "JavaScript"; } };
   obj1.name = "JavaScript"; // throws an error
</script>
  1. 在严格模式下,当函数内部使用“this”关键字时,它引用了通过该函数调用的引用对象。如果未指定引用对象,则它引用 undefined 值。

<script>
   'use strict';
   function test() {
      console.log(this); // Undefined
   }
   test();
</script>
  1. 在严格模式下不能使用“with”语句。

<script>
   'use strict';
   with (Math) {x = sin(2)}; // This will throw an error
</script>
  1. 出于安全原因,不能使用 eval() 函数声明变量。

<script>
   'use strict';
   eval("a = 8")
</script>
  1. 不能将作为保留的关键字用作标识符。以下关键字为将来保留:[style="arabic"]

    1. implements

    2. interface

    3. package

    4. private

    5. protected