严格模式
位置
- 放在脚本文件的第一行,整个脚本都将以严格模式运行。
- 放在函数体的第一行,则整个函数以严格模式运行。
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>