1、JavaScript中两种模式
正常模式和严格模式
2、ES5添加严格模式的目的
- 消除了JavaScript 语法的一些不合理,不严谨之处,减少了一些怪异行为。
- 消除代码运行的一些不安全之处,保证代码运行的安全。
- 提高编译器效率,增加运行速度。
- 禁用了在ECMAScripe的未来版本中可能会定义的一些语法,为未来新版本的JavaScript 做好铺垫,比如一些保留字如: class, export , extends , import , super 不能做变量名。
3、开启严格模式
3.1针对整个脚本文件
为整个脚本开启严格模式,需要在所有语句之前放一个特定语句“use strict”;(或’use strict’)
<script>
'use strict'
//下面的js代码就会按照严格模式执行代码
</script>
3.2针对单个函数体
将’use strict’放在函数体的第一行,则整个函数以“严格模式”执行。
<script>
function fn(){
'use strict'
//下面的js代码就会按照严格模式执行代码
}
</script>
4、严格模式与正常模式的语法与行为上的不同
4.1严格模式下语法的变化
正常模式下,变量没有声明就赋值,打印是没有问题的,这是因为默认情况下变量是全局变量。然而在严格模式下,若变量没有声明便赋值是会报错的,因为严格模式禁用这种语法,要求全局变量必须先声明。并且在严格模式下我们不能随便删除已经声明过的变量
//正常模式下
num = 10;
console.log(num); //正常显示 10
//严格模式下
'use strict'
// num = 10;
// console.log(num); //严格模式下未申明变量会报错
var num = 10;
console.log(num); //声明之后会正常显示 10
delete num //严格模式下删除已经申明的变量会报错
4.2 严格模式下this指向的变化
在全局作用域函数中this 指向 window 对象,但是在严格模式下全局作用域中函数的 this 是 undefind
。
//平常模式下
function fn(){
console.log(this); //打印结果为 window对象
}
fn()
//严格模式下
function fn(){
'use strict'
console.log(this); //打印结果为 undefined
}
以前构造函数时不加new 也可以调用,作为普通函数,这时 this 指向全局对象,但是在严格模式下,如果构造函数不加new 调用,this 会报错, new 实例化的构造函数指向创建的对象实例。
// An highlighted block
var foo = 'bar';//平常模式下
function Stu(){
this.name = 'anni' //this指向window
}
Stu()
console.log(window.name); //结果为anni
//严格模式下
'use strict'
function Stu(){
this.name = 'anni'
}
// Stu() //严格模式下直接调用会报错,构造函数需要加 new 调用
var stu = new Stu();
console.log(stu.name); //结果打印 anni
在定时器中 this 还是指向 window
'use strict'
setTimeout(function(){
console.log(this); //this 依旧指向 wiondow
},2000)
4.3 严格模式下函数的变化
平常模式下函数名如果是可以允许冲突的,但在严格模式下是不允许函数名冲突的
//平常模式下
function sum(a,a){
console.log(a+a); //打印结果为 4 ,这是因为第一次将1赋值给了a之后,第二次又将2 赋值给了a
}
sum(1,2);
//严格模式下
function sum(a,a){
console.log(a+a); //报错
}
sum(1,2);