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