什么是严格模式?
所谓JS的严格模式就是在js脚本(或函数)第一行代码添加 use strict
表达式,表示该脚本(或函数)启用了严格模式。它可以消除帮助我们消除JS语法中不严谨的的地方。
JS脚本启用严格模式:
"use strict"; //第一行
func();
function func() {
a = 666;
}
JS函数启用严格模式:
func();
function func() {
"use strict";
a = 666
}
虽然use strict
是后增加的内容,但你可以放心在低版本浏览器中使用它,因为不支持JS严格模式的浏览器会自动忽略这条表达式,所以它不会给你添加新的麻烦。
严格模式解决了什么问题?
JS严格模式主要解决了使用未声明的变量从而‘意外的’全局变量问题、修改了全局this、限制修改作用域的方法等,还新增了一些关键字,以及一些其他的限制。
‘意外的’全局变量:
例如:我们在修改代码的时候常常需要新加一个变量,但时常会忘记声明直接使用。这在非严格模式是不会报错的,编译器在执行到这行代码的时,发现它没有声明会自动创建这个全局变量继续使用,这就造成了内存泄露问题。 但在严格模式下,编译器在执行到这行代码的时,发现它没有声明就会报错:‘编译错误 xx 未定义’,从而提醒我们去声明变量,避免了内存泄露。
"use strict";
func();
function func() {
a = '变量a 未定义'; // Uncaught ReferenceError: a is not defined
}
全局执行的 this
指向undefined
严格模式中在全局下执行的 this不会指向全局对象,而是undefined;
f(); //undefined
function f(){
"use strict";
return this;
}
所以,使用构造函数时,如果忘了加new,会报错。
function Foo(){
"use strict";
this.name = '张三';
}
var f = Foo (); //报错
限制使用eval()、禁止使用with修改作用域
在严格模式下, eval()
是限制使用的,虽然还保有其核心功能,但并不会修改它所在的作用域;
function foo(str) {
"use strict";
eval( str ); // 李四
console.log( a ); // ReferenceError: a is not defined
}
var str = "var a = '张三', b = '李四';console.log(b);"
foo(str);
在严格模式下,with
是禁止使用的,使用会直接报错;
"use strict";
var obj = {};
obj.name= '张三';
with (obj) {
name = '法外狂徒';
}
console.log(obj.name); //Uncaught SyntaxError: Strict mode code may not include a with statement
注意:虽然在非严格模式下允许使用eval()、with修改作用域,但请避免使用它们,因为它们会带来很差的性能。
其他限制
不允许使用八进制、不允许使用转义字符、变量名不能使用 "eval"和"arguments" 字符串、不允许变量重名、不允许对只读属性赋值、不允许删除函数等等
这里我们注意一下前两条就好,其他的我相信大家也不会那么干
新增保留字:
implements、interface、let、package、private、 protected、public、static、yield
结语
JS一直以来因为语法不够严谨,被人们所诟病,JS的严格模式一定程度上消除了一些不合理、不严谨的地方。
它保证了代码的安全运行,同时还提高了JS运行效率。
所以,你会用严格模式吗?