• 微信号
  • 微信号
目录

javascript

您当前的位置:首页 > 我的笔记 > javascript>JS严格模式(use strict)详解

JS严格模式(use strict)详解

url = 'http://c.biancheng.net/';),此时 JavaScript 解释器会自动为您创建这个变量。为了使代码更加严谨,JavaScript 中引入了严格模式,一旦使用了严格模式,将不再允许使用那些不严谨的语法。

什么是严格模式

严格模式是在 ECMAScript5(ES5)中引入的,在严格模式下,JavaScript 对语法的要求会更加严格,一些在正常模式下能够运行的代码,在严格模式下将不能运行。

添加严格模式,主要有以下几个目的:

  • 消除 JavaScript 语法中一些不合理、不严谨的地方;
  • 消除代码中一些不安全的地方,保证代码的安全运行;
  • 提高 JavaScript 程序的运行效率;
  • 为以后新版本的 JavaScript 做好铺垫。

目前,主流浏览器包括 IE10 及其之后的版本都已支持严格模式,JavaScript 正在向着更合理、更安全、更严谨的方向发展。

启用严格模式

'use strict'; 指令即可,如下所示:
<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="UTF-8"> 
<title>JavaScript</title> 
</head> 
<body> 
<script> 
"use strict"; 
x = 'http://c.binacheng.net/'; // 此处报错:Uncaught ReferenceError: x is not defined at index.html:11 
console.log(x); 
</script> 
</body> 
</html>
"use strict";,则表示只在该函数中启用严格模式。如下例所示:
<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="UTF-8"> 
<title>JavaScript</title> 
</head> 
<body> 
<script> 
x = 'http://c.binacheng.net/'; 
console.log(x); 
function sayHello(){ 
'use strict'; 
str = 'welcome http://c.binacheng.net/'; // 调用 sayHello() 函数在此处报错:Uncaught ReferenceError: str is not defined at sayHello (index.html:14) at index.html:17 
console.log(str); 
} 
sayHello(); 
</script> 
</body> 
</html>
'use strict'; 指令只有在整个脚本第一行或者函数第一行时才能被识别,除了 IE9 以及更低的版本外,所有的浏览器都支持该指令。

严格模式中的变化

相对于普通模式来说,严格模式对 JavaScript 的语法都做了一些改变。

1、不允许使用未声明的变量

普通模式下,如果一个变量还没有声明,就直接拿来赋值,JavaScript 解释器会自动为您创建这个变量。而在严格模式下,则不允许这么做,所有变量在使用前必须显式的声明,否则将会抛出一个 ReferenceError 错误。

"use strict"; 
v = 1; 
// 此处报错:Uncaught ReferenceError: v is not defined 
for(i = 0; i < 2; i++) { // 此处报错:Uncaught ReferenceError: i is not defined 
}

2、不允许删除变量或函数

在严格模式下,如果您尝试删除一个变量或函数,则会抛出语法错误。而在普通模式下,虽然不会成功,但并不报错。

"use strict"; 
var person = {name: "Peter", age: 28}; 
delete person; 
// 此处报错:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. 
function sum(a, b) { 
return a + b; 
} 
delete sum; 
// 此处报错:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

3、函数中不允许有同名的参数

在严格模式下,如果函数中有两个或多个同名参数,则会抛出语法错误,而在普通模式下则不会。

"use strict"; 
function square(a, a) { 
// 此处报错:Uncaught SyntaxError: Duplicate parameter name not allowed in this context 
return a * a; 
}

4、eval 语句的作用域是独立的

普通模式下,eval 语句的作用域取决于它所在的位置,而在严格模式下,eval 语句本身就是一个局部作用域,通过 eval 语句生成的变量只能在 eval 语句内使用。

"use strict"; 
eval("var x = 5; console.log(x);"); 
console.log(x); 
// 此处报错:Uncaught ReferenceError: x is not defined

5、不允许使用 with 语句

在严格模式下,不允许使用 with 语句。

"use strict"; 
var radius1 = 5; 
var area1 = Math.PI * radius1 * radius1; 
var radius2 = 5; 
with(Math) { 
// 此处报错:Uncaught SyntaxError: Strict mode code **y not include a with statement 
var area2 = PI * radius2 * radius2; 
}

6、不允许写入只读属性

在严格模式下,不允许为只读或不存在的属性赋值,否则会造成语法错误,而在普通模式下,虽然不会成功,但并不会报错。

"use strict"; 
var person = {name: "Peter", age: 28}; 
Object.defineProperty(person, "gender", {value: "**le", writable: false}); 
person.gender = "fe**le"; // 此处报错:Uncaught TypeError: Cannot assign to read only property 'gender' of object '#<Object>'

7、不允许使用八进制数

在严格模式下,不允许使用八进制数(以零为前缀的数字,例如 010、0377),而在普通模式下则可以。

"use strict"; 
var x = 010; // 此处报错:Uncaught SyntaxError: Octal literals are not allowed in strict mode. 
console.log(parseInt(x));

8、不能在 if 语句中声明函数

在严格模式下,不能在 if 语句中声明函数,调用在 if 语句中定义的函数时,会提示函数未定义。

"use strict"; 
//如果在if语句中声明函数,则会产生语法错误 
if (true) { 
function **() { // 此处报错:Uncaught ReferenceError: ** is not defined 
console.log("http://c.biancheng.net/"); 
} 
} 
**();

9、禁止使用 this 表示全局对象

在普通模式下,this 关键字表示全局对象 window,而在严格模式下,this关键字则表示 undefined。

"use strict"; 
var name = "http://c.biancheng.net/"; 
function **Test() { 
console.log(this); 
} 
**Test();