一、严格模式
ES5拓展了严格模式,是我们的代码更加的安全可靠
在之前书写代码都是处于正常模式下
正常模式下,定义一个变量可以不使用 var ,严格模式下是不允许的
正常模式下,可以使用八进制,严格模式下不允许
正常模式下,可以使用arguments.callee,严格模式下不允许
1.1 开启严格模式
使用方式:“use strict”
加入“use strict”之后,如果认识它的浏览器就会自动开启严格模式;如果不认识它的浏览器也只是把它当作一个字符串定义,不会影响后续代码
开启严格模式之后,就必须按照严格模式的代码规范书写代码
在js代码第一行加入“use strict”,此时代码将处于“全局严格模式”
在某个函数的第一行加入“use strict”,当函数执行的时候,此时函数处于“局部严格模式”
举例:
在正常模式下:
1 | // 使用 var 定义变量 |
在严格模式下:
1 | // 开启严格模式 |
会报错:
1 | // 使用 var 定义变量 |
局部严格模式:
1 | // 局部严格模式 |
1.2 在严格模式下定义变量
在严格模式下定义变量,必须使用var声明
允许:
var a = 10;
不允许:
b = 20;
举例:
1 | // 开启严格模式 |
1.3 八进制
在js中有三种进制:
8 进制
10 进制
16 进制
默认是 10 进制
以 0 开头是 8 进制
以 0x,或ox开头的是 16 进制
允许:
1 | var num = 16; |
不允许:
1 | var num = 011; |
举例:
在正常模式下:
1 | // 定义变量 |
输出:
在严格模式下:
1 | // 开启严格模式 |
会报错:
1.4 arguments.callee
代码写的越“具体”,越能提升性能
arguments.callee 在编译阶段是无法解析出来,至于当执行到的时候才能确定下来,所以就无从提升性能
1 | // 安全类 |
在正常模式下:
1 | // 安全类 |
在严格模式下:
1 | // 开启严格模式 |
会报错:
1.5 使用delete
使用delete可以删除对象中的属性
若果要删除一个变量:
在正常模式下,可以执行成功,不会删除成功,但是不会报错
在严格模式下,会报错
在正常模式下:
1 | // 定义全局变量 |
在严格模式下:
1 | // 开启严格模式 |
会报错:
1.6 使用保留字定义变量
正常模式下,可以使用保留字定义变量
严格模式下,不能使用保留字定义变量
在正常模式下:
1 | // 使用保留字 |
在严格模式下:
1 | // 开启严格模式 |
会报错:
1.7 eval
eval是一个函数,可以将字符串当作代码执行,但是会污染全局作用域
在严格模式下是不允许使用的,所以可以避免污染全局作用域
在正常模式下:
1 | // 定义变量 |
在严格模式下:
1 | // 开启严格模式 |
输入 a 会报错:
严格模式下,检测eval的方式:
1 | // 开启严格模式 |
1.8 with
with是一个语法,在代码执行的时候,会改变作用域
1 | with(target){ |
正常模式下:
1 | // 定义对象 |
严格模式下:
1 | // 开启严格模式 |
会报错:
1.9 变量名称
在正常模式下,在一个对象中定义属性可以是同名的
在严格模式下,不会报错,只是浏览器检测不出来
举例:
正常模式下:
1 | // 定义对象 |
严格模式下:
1 | // 开启严格模式 |
注:没有区别,不是严格模式没有开启,只是浏览器没有实现
1.10 全局函数作用域
在全局函数作用域中的this指向window,会污染全局作用域
在严格模式下,全局作用域中的this变为undefined,就可以避免对全局作用域的污染
举例:
正常模式下:
1 | // 定义函数 |
严格模式下:
1 | // 开启严格模式 |
会报错,this指向变为undefined:
1.11 函数参数
正常模式下,定义函数的参数可以使同名的,但是后面的会覆盖前面的
严格模式下,则是不允许的
在正常模式下:
1 | // 定义函数 |
在严格模式下:
1 | // 开启严格模式 |
会报错: