什么是严格模式
JavaScript除了提供正常模式外,还提供了严格模式。ES5的严格模式是采用具有限制性
JavaScript变体的一种方式,即在严格的条件下运行的JS代码
严格模式在IE10以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略
严格模式对正常的JavaScript语义做了一些更改
1.消除了JavaScript语法的一些不合理、不严谨之处,减少了一些怪异行为
2.消除代码运行的一些不安全之处,保证代码运行的安全
3.提高编译器效率,增加运行速度
4.禁用了在ECMAScript的未来版本中可能会定义的一些语法,为未来新版本的JavaScript做好铺垫
比如一些保留字节:class、enum、export、extends、import、super不能做变量名
严格模式应该应用到整个脚本或个别函数中,因此在使用时,我们可以将严格模式分为【为脚本开启的严格模式】
和【为函数开启严格模式】两种情况
一、为脚本开启严格模式
为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 “use strict
”;或( ‘use strict
’)
二、为函数开启严格模式
要给某个函数开启严格模式,需要把"use strict
";或( ‘use strict
’)声明放在函数体所有语句之前
2.开启严格模式的几种方式
//1.脚本开启严格模式: 当开启"use strict",下面的JavaScript代码就会按照严格模式执行代码
<script>
"use strict";
</script>
//2.为函数开启严格模式:此时只是给fn()开启严格模式,不影响其他的函数
<script>
function fn(){
"use strict";
}
</script>
3.严格模式带来的变化
1.我们的变量名必须先声明再使用
<script>
"use strict";
num = 10;
console.log(num); //ReferenceError:num is not defined at
</script>
2.不能随意删除已经声明好的变量
<script>
"use strict";
let num = 10;
console.log(num);
delete num; //SyntaxError: Delete of an unqualified identifier in strict mode
</script>
3.严格模式下全局作用域中函数中的this是 undefined
<script>
"use strict";
function fn() {
console.log(this) //undefined
}
fn();
</script>
4.严格模式下,如果构造函数不加new调用,this指向的是undefined如果赋值则会报错,如果使用了new调用构造函数则不会报错
<script>
"use strict";
function Star() {
this.sex = "男";
}
var ldh = new Star();
console.log(ldh.sex);
function Star() {
this.sex = "男";
}
Star();
</script>
5.严格模式下,定时器this还是指向的是window
<script>
"use strict";
setTimeout(function () {
console.log(this); // window
}, 1000);
</script>
6.严格模式下函数里面的参数不允许有重名
<script>
"use strict";
function fn(a, a) {
console.log(a + a);
}
fn(1, 2);
</script>
7.不允许在非函数的代码块内声明函数,但可以在函数内声明函数
<script>
"use strict";
if (true) {
function ft() {
console.log(11); //虽然不会报错,但在严格模式中是语法错误
}
ft();
}
for (let i = 0; i < 4; i++) {
function f() {
console.log(22); //虽然不会报错,但在严格模式中是语法错误
}
f();
}
function baz() {
eit();
function eit() {
console.log(33); //语法正确
}
}
baz();
</script>
还有很多严格模式的变化就不在这里全部讲述了感兴趣的同学可以自行查看严格模式