在JS中 除了提供正常模式外,还提供了严格模式(strict mode)既在严格的条件下运行 JS 代码。 严格模式在 IE10 以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略。 严格模式对正常的 JavaScript 语义做了一些更改比如:
-
消除了 Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为。 -
消除代码运行的一些不安全之处,保证代码运行的安全。 -
提高编译器效率,增加运行速度。 -
禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,为未来新版本的 Javascript 做好铺垫。比如一些保留字如:class, enum, export, extends, import, super 不能做变量名
二、进入标志: "use strict"; (或 'use strict';) 注意:老版本的浏览器会把它当作一行普通字符串,加以忽略。
调用方式:
script>
"use strict";
console.log("这是严格模式。");
</script>
function strict(){
"use strict";
return "这是严格模式。";
}
function notStrict() {
return "这是正常模式。";
}
3.在直接执行函数中开启严格模式:
(function (){
"use strict";
console.log("这是严格模式。");
})();
严格模式下语法的改变以及禁用的保留字:
- 全局变量中我们的变量名必须先声明再使用 :
<script>
'use strict';
var num = 10;
console.log(num);
</script>
- 我们不能随意删除已经声明好的变量
- 严格模式下全局作用域中函数中的 this 是 undefined。
function fn() {
console.log(this);
}
fn();
- 禁止this关键字指向全局对象
function f(){
return !this;
}
function f(){
"use strict";
return !this;
}
因为严格模式下,this的值为undefined,所以"!this"为true。 因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。
- 定时器 this 还是指向 window
setTimeout(function() {
console.log(this);
}, 2000);
- 严格模式下函数里面的参数不允许有重名
function fn(a, a) {
console.log(a + a);
};
fn(1, 2);
function fn() {}
总结:
-
严格模式下全局作用域中函数中的 this 是 undefined。 -
严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错 -
new 实例化的构造函数指向创建的对象实例。 -
定时器 this 还是指向 window 。 -
事件、对象还是指向调用者。
|