二维码

JavaScript 严格使用

JavaScript 严格使用


"use strict";定义 JavaScript 代码应在 “严格模式”。


“use strict”指令

"use strict"指令是 ECMAScript 版本 5 中的新指令。

它不是一个语句,而是一个文字表达式,被早期版本忽略 的 JavaScript。

"use strict"的目的是指示代码应该在“严格模式”下执行。

例如,在严格模式下,不能使用未声明的变量。

除 Internet Explorer 9 及更低版本外,所有现代浏览器都支持“使用严格”:

指令
“use strict” 13.0 10.0 4.0 6.0 12.1

表中的数字指定完全支持该指令的第一个浏览器版本。

您可以在所有程序中使用严格模式。它可以帮助您编写更干净的代码, 比如阻止你使用未声明的变量。

"use strict"只是一个字符串,所以 IE 9 即使不理解它也不会抛出错误。


声明严格模式

严格模式是通过添加 “use strict” 来声明的; 脚本或函数。

在脚本的开头声明,它具有全局范围(所有代码 在脚本中将以严格模式执行):

1
2
"use strict";  
x = 3.14;       // This will cause an error because x is not declared

1
2
3
4
5
6
"use strict";  
myFunction();

function myFunction() {
  y = 3.14;   // This will also cause an error because y is not declared
}

在函数内部声明,它具有局部作用域(只有函数内部的代码是 在严格模式下):

1
2
3
4
5
6
7
x = 3.14;       // This will not cause an error.  
myFunction();

function myFunction() {
  "use strict";
  y = 3.14;   // This will cause an error
}


“use strict”;语法

用于声明严格模式的语法旨在与 旧版本的 JavaScript。

编译数字文字 (4 + 5;) 或字符串文字 (“John Doe”;) JavaScript 程序没有副作用。它只是编译为不存在的 变量和死亡。

所以"use strict";仅对“理解”其含义的新编译器才重要。


为什么选择严格模式?

严格模式使编写“安全”JavaScript 变得更加容易。

严格模式将以前接受的“错误语法”更改为实际错误。

例如,在普通 JavaScript 中,错误键入变量名称会创建一个新的 全局变量。在严格模式下,这将引发错误,使其无法实现 意外创建全局变量。

在普通的 JavaScript 中,开发人员不会收到任何错误反馈 为不可写的属性赋值。

在严格模式下,对不可写属性的任何赋值,仅 getter 属性、不存在的属性、不存在的变量或不存在的变量 对象,将抛出错误。


不允许在严格模式下使用

不允许在不声明变量的情况下使用变量:

1
2
"use strict";  
x = 3.14;                // This will cause an error

对象也是变量。

不允许在未声明的情况下使用对象:

1
2
"use strict";  
x = {p1:10, p2:20};      // This will cause an error

不允许删除变量(或对象)。

1
2
3
"use strict";  
let x = 3.14;
delete x;                // This will cause an error

不允许删除函数。

1
2
3
"use strict";  
function x(p1, p2) {};
delete x;                // This will cause an error 

不允许复制参数名称:

1
2
"use strict";  
function x(p1, p1) {};   // This will cause an error

不允许使用八进制数字文字:

1
2
"use strict";  
let x = 010;             // This will cause an error

不允许使用八进制转义字符:

1
2
"use strict";  
let x = "\010";            // This will cause an error

不允许写入只读属性:

1
2
3
4
5
"use strict";  
const obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;            // This will cause an error

不允许写入 get-only 属性:

1
2
3
4
"use strict";  
const obj = {get x() {return 0} };

obj.x = 3.14;            // This will cause an error

不允许删除不可删除的属性:

1
2
"use strict";  
delete Object.prototype; // This will cause an error

eval词不能用作变量:

1
2
"use strict";  
let eval = 3.14;         // This will cause an error

arguments词不能用作变量:

1
2
"use strict";  
let arguments = 3.14;    // This will cause an error

不允许使用with语句:

1
2
"use strict";  
with (Math){x = cos(2)}; // This will cause an error

出于安全原因,不允许eval()在调用它的范围内创建变量。

:在严格模式下,变量在声明之前不能使用
1
2
3
"use strict";  
eval ("x = 2");
alert (x);      // This will cause an error

:在严格模式下,eval()不能使用`var`关键字声明变量
1
2
3
"use strict";  
eval ("var x = 2");
alert (x);    // This will cause an error

:eval()不能使用 let 关键字声明变量
1
2
eval ("let x = 2");  
alert (x);        // This will cause an error

函数中的this关键字行为 在严格模式下有所不同。

this关键字指的是调用该函数的对象。

如果未指定对象,严格模式下的函数将返回undefined,普通模式下的函数将返回全局对象(window):

1
2
3
4
5
"use strict";  
function myFunction() {
  alert(this); // will alert "undefined"
}
myFunction();


面向未来!

为将来的 JavaScript 版本保留的关键字不能用作变量 严格模式下的名称。

这些是:

  • implements

- interface

  • let

  • package

  • private

  • protected

  • public

  • static

  • yield

1
2
"use strict";  
let public = 1500;      // This will cause an error

注意!

“use strict”指令仅在脚本的开头被识别 或函数。