ECMAScript5——严格模式

严格模式

位置

  • 放在脚本文件的第一行,整个脚本都将以严格模式运行。
  • 放在函数体的第一行,则整个函数以严格模式运行。 

ES5 引入严格模式,在代码头部加上 “use strict” 即可开启严格模式。严格模式主要有以下限制。

  • 变量必须先声明后使用
  • 函数的参数不能有同名属性,否则会报错
  • 不能使用 with 语句
  • 不能对只读属性赋值,否则会报错
  • 不能使用前缀 0 表示八进制数,否则会报错
  • 不能删除不可删除的属性,否则报错
  • 不可删除变量 delete prop ,会报错,只能删除属性 delete global[prop]
  • eval 不会它的外层作用域引入变量
  • eval 和 arguments 不能被重新赋值
  • arguments 不会自动反映函数参数的变化
  • 不能使用 arguments.callee
  • 不能使用 arguments.caller
  • 禁止 this 指向全局对象
  • 不能使用 fn.caller 和 fn.arguments 获取函数调用的堆栈
  • 增加了保留字(如 protected static interface)

1. 开启严格模式

启动方式: "use strict"

启动严格模式之后,要严格按照严格模式的规范来书写代码, 在该语句之前,都处于正常模式。

写入”use strict”之后, 再识别该字符串的浏览器,会启动严格模式,如果浏览器不识别, 它会只定义一行 字符串而已, 不会影响后续代码。

如果在js代码的第一行,启动严格模式, 此时处于“全局严格模式”

在函数内部第一行,启用严格模式, 在函数执行时候,会处于“局部严格模式”,当函数完毕,严格模式已经关闭,不会影响后续代码。

2. 严格模式下定义变量

在严格模式下, 必须使用var 关键字

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
	// 开启严格模式
	"use strict"
	// 正常模式下定义变量
	var a = 10;
	// 不使用var  会报错  b is not defined
	b = 10;  
	</script>
</body>
</html>

3. 严格模式下八进制

js中的进制有3种: 分别是 10进制、 8进制、 16进制

默认是10进制,8进制以0开头,16进制以0x ox开头

严格模式下八进制不能使用0开头

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
	// 开启严格模式
	"use strict"
	// 正常模式 一切正常
	var num = 10; //10
	var num1 = 011;// 9
	var num2 = 0xff; //255
	

	// 严格模式
	var num = 10; //正常
	var num1 = 011;//报错
	var num2 = 0xff;//正常
	console.log(num)
	console.log(num1)
	console.log(num2)


	</script>
</body>
</html>
4. 严格模式下 arguments.callee

arguments.callee 会影响性能。

代码只有写的越“具体”,才会执行的更顺畅。

arguments.callee只有在执行的时候才能确定指向哪一个, 编译阶段是无法确定的, 所以不会提升性能

严格模式不能使用arguments.callee  arguments.caller

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
	"use strict"
	// 定义构造函数
	function People(name, age, sex) {
		if (this instanceof arguments.callee) {
			this.name = name;
			this.age = age;
			this.sex = sex;
		} else {
			return new arguments.callee(name, age, sex)
		}
	}

	// 实例化
	var p = new People("小明", 12, "男")
	var p1 = People("小明", 12, "男")
	// 会报错 严格模式不能使用arguments.callee  arguments.caller
	</script>
</body>
</html>

5. 严格模式下delete变量

在正常模式下:可以删除对象中的属性,也可以删除变量, 会执行成功, 但是不会删除变量

在严格模式下不允许删除变量,可以删除属性(除了设置不可删除特性)

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
	// 严格模式
	"use strict"
	// 定义变量
	var a = 10;
	window.b = 20;

	delete window.b;
	delete a;
	</script>
</body>
</html>

6. 严格模式下用保留字定义变量

严格模式下不能用保留字定义变量

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
	// 严格模式下
	"use strict"
	// 使用保留字定义变量
	var public = "red";
	console.log(public)
	</script>
</body>
</html>

7.  严格模式下eval( )

严格模式下不能使用eval( )

eval( )方法

是一个函数,可以将字符串作为代码执行

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
	// 严格模式
	"use strict"
	// 定义字符串
	var strcode = "var a = 10";
	// 使用eval函数执行
	// 正常模式中变量a会被定义出来。
	// 严格模式中变量a不会被定义出来。
	eval(strcode);  



	// 染过严格模式
	// var s = eval;
	// s(strcode)
	// 这是不允许的。 

	// 在严格模式下是a没有被定义出来

	// eval等价方式
	// var a = 10;
	// console.log(a)
	</script>
</body>
</html>

8. 严格模式下with

严格模式下不能使用with

with 是一个语法

with(target) {

}

正常模式下正常   严格模式下报错

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
		// 严格模式
		// "use strict"
		var obj = {
			a: 1,
			b: 2
		}

		var a = 11;
		var b = 12;
		with (obj) { 
			// 此时,obj里存在a 输出a 如果不存在则通过词法作用域一直往上查找
			console.log(a)
			// 此时,obj里存在a 输出a
			console.log(b)
			// 改变a obj {a:20,b:2}
			a = 20;
			// 定义新变量
			c = 50  // 此时, c被添加到了全局作用域中 并没有添加到obj中
		}
	</script>
</body>
</html>

9. 严格模式下函数相关

严格模式下支持块级作用域,正常模式下不支持块级作用域

//严格模式支持块作用域
if (true) {
	function fun(a) {
		console.log(a)
	}
}
fun(1) 
//正常模式可以调用
// 严格模式此时 会报错

严格模式下全局函数this指向undefined 

正常模式下全局函数this指向window

function fun(color) {
	console.log(this)
	this.color = "red"
}
fun("blue")

严格模式下函数同名形参:

正常模式输出最后一个参数,严格模式下函数同名形参报错

"use strict"
// 定义函数
function fun(color, color) {
	console.log(color)
}
// 调用
// 正常模式输出blue
// 严格模式报错
fun("red", "blue")

10. 严格模式下特殊字符

严格模式下不能使用特殊字符

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
	"use strict"
	// 在非严格模式下可以使用特殊符号 在严格模式下会报错
	var str = "你\012好"
	console.log(str)
	</script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/thunderevil35/article/details/80554984
今日推荐