JavaScript 严格模式(use strict)

  • JavaScript Use Strict

    "use strict"定义JavaScript代码应该以“严格模式”执行。
    "use strict"指令是ECMAScript第5版中的新指令。它不是一个语句,而是一个文字表达式,被早期版本的JavaScript忽略。"use strict"目的是表明代码应该以“严格模式”执行。例如,使用严格模式,您不能使用未声明的变量。除Internet Explorer 9及更低版本外,所有现代浏览器都支持"use strict"
    您可以在所有程序中使用严格模式。它可以帮助您编写更清晰的代码,例如阻止您使用未声明的变量。"use strict" 只是一个字符串,所以IE 9即使不理解它也不会抛出错误。
  • 声明严格模式

    通过添加“use strict”到脚本或函数的开头来声明严格模式。在脚本开头声明,它具有全局范围(脚本中的所有代码都将以严格模式执行):
    "use strict";
    x = 3.14;       // 这将导致错误,因为未声明x
    尝试一下
    在函数内部声明,它具有局部作用域(只有函数内部的代码处于严格模式):
    x = 3.14;       // 这不会报错 
    myFunction();
    
    function myFunction() {
      "use strict";
      y = 3.14;   // 这会报错
    }
    尝试一下
  • "use strict";语法

    声明严格模式的语法旨在与旧版本的JavaScript兼容。在JavaScript程序中编译数字文字(4 + 5;)或字符串文字(“John Doe”;)没有副作用。它只是编译成一个非现有的变量而死掉。所以"use strict";只对那些“理解”它的含义的新编译器有意义。

    为何选择严格的模式?

    严格模式可以更轻松地编写“安全”的JavaScript代码。严格模式将以前接受的“错误语法”更改为实际错误。例如,在普通的JavaScript中,错误输入变量名称会创建一个新的全局变量。在严格模式下,这将引发错误,从而无法意外创建全局变量。在普通的JavaScript中,开发人员不会收到任何错误反馈,将值分配给不可写属性。在严格模式下,对非可写属性,仅存在getter(可读)属性,不存在的属性,不存在的变量或不存在的对象的任何赋值都将引发错误。
  • 在严格模式下不允许

    不允许使用变量前而不声明它:
    "use strict";
    x = 3.14;                // 这将报错
    尝试一下
    不允许使用对象(对象也是变量)前而不声明它:
    "use strict";
    x = {p1:10, p2:20};      // 这将报错
    尝试一下
    不允许删除变量(或对象)。
    "use strict";
    var x = 3.14;
    delete x;                // 这将报错
    尝试一下
    不允许删函数。
    "use strict";
    function x(p1, p2) {}; 
    delete x;                 // 这将报错
    尝试一下
    不允许复制参数名称:
    "use strict";
    function x(p1, p1) {};  // 这将报错
    尝试一下
    不允许使用八进制数字文字:
    "use strict";
    function x(p1, p1) {};  // 这将报错
    尝试一下
    不允许写入只读属性:
    "use strict";
    var obj = {};
    Object.defineProperty(obj, "x", {value:0, writable:false});
    
    obj.x = 3.14;            // 这将报错
    尝试一下
    不允许写入get-only属性:
    "use strict";
    var obj = {get x() {return 0} };
    
    obj.x = 3.14;            // 这将报错
    尝试一下
    不允许删除不可删除的属性:
    "use strict";
    delete Object.prototype; // 这将报错
    尝试一下
    字符串“eval”不能用作变量:
    "use strict";
    var eval = 3.14;         // 这将报错
    尝试一下
    字符串“arguments”不能用作变量:
    "use strict";
    var arguments = 3.14;    // 这将报错
    尝试一下
    不允许使用with语句:
    "use strict";
    with (Math){x = cos(2)}; // 这将报错
    
    尝试一下
    出于安全原因,不允许eval()在调用它的范围内创建变量:
    "use strict";
    eval ("var x = 2");
    alert (x);             // 这将报错
    
    尝试一下
    在像f()这样的函数调用中,this值是全局对象。在严格模式下,它现在是未定义的。
  • JavaScript未来保留

    为未来JavaScript版本保留的关键字不能在严格模式下用作变量名。这些是:
    • implements
    • interface
    • let
    • package
    • private
    • protected
    • public
    • static
    • yield
    "use strict";
    var public = 1500;      // 这将报错
    尝试一下
    小心!“use strict”指令仅在脚本或函数的开头被识别。