什么是严格模式?
JavaScript 中有有两种模式,一种是普通模式,另一种就是严格模式。
严格模式是在 ES5 添加的,比普通模式要多一部分的 JavaScript 规则,这使得 JavaScript 在更严格的条件下运行。
JavaScript 一般默认是普通模式,ES6 的模块和 Class 类默认是严格模式。
使用严格模式有什么好处?
- 使用严格模式可以消除 JavaScript 语言中的一些不合理、不严谨之处,减少怪异现象。
- 消除代码运行的一些不安全的地方,保证代码能够安全运行。
- 可以提高编译器效率,提高运行速度。
- 禁止使用可能在 ECMAScript 的未来版本中定义的潜在保留字。
严格模式的使用
严格模式的触发是使用: "use strict",严格模式有两种使用场合:一种是脚本范围,一种是函数范围。
- 第一,针对整个脚本调用:
在 HTML 文件中,可以在 <script>
标签内部直接使用 "use strict"。将 "use strict" 放在所有要运行的代码前面,整个脚本都将在严格模式下运行。格式如下所示:
<script>
"use strict";
</script>
示例:
例如我们之前有讲过在定义变量的时候不如不加关键字 var
,则表示创建的是全局变量对吧。但是这是在一般模式下,在严格模式下定义变量不加关键字 var
会导致报错:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS_侠课岛(9xkd.com)</title>
</head>
<body>
<script>
"use strict";
a = 6
console.log(a);
</script>
</body>
</html>
在浏览器中打开,我们会看到浏览器中的控制台显示如下所示:
需要注意的是,"use strict" 前面不能有可执行代码,否则严格模式就会失效,我们来看一下下面这段代码:
<script>
console.log("use strict前面不能有代码")
"use strict";
a = 6
console.log(a);
</script>
如果此时在浏览器中打开这个 html 文件,控制台显示如下所示,严格模式失效:
- 第二,针对函数范围使用:
在函数的最顶部使用 "use strict",则整个函数内都是在严格模式下运行:
function func(){
"use strict";
}
示例:
例如我们来看下面这个函数,在函数 add
中,定义了两个参数,但是两个参数名都相同:
function add(a, a){
return a+a;
}
var result = add(2, 3);
console.log(result);
此时我们执行这个函数,最终输出结果为 6
,因为后面的这个参数会覆盖的参数,所以其实 return a+a
返回值的结果为 3 + 3
。但是这个在一般模式下运行,如果在严格格式下运行会怎么样呢?
function add(a, a){
"use strict";
return a+a;
}
var result = add(2, 3);
console.log(result);
执行代码,你会看到控制台显示:
报错信息告诉我们,“此上下文中不允许有重复的参数名”,所以在严格模式下,是不支持用重复的参数名的。
严格模式中的变化
我们来看一下严格模式和一般模式相比,有了什么变化。
- 严格模式下不允许使用未声明的变量,也就是说不管是全局变量还是局部变量都需要使用关键字
var
定义。
<script>
"use strict";
a = 1
console.log(a); // test.html:10 Uncaught ReferenceError: a is not defined
</script>
- JavaScript 语言中允许动态绑定,但是严格模式对动态绑定做出了一点限制,某些情况下,只允许静态绑定。
// 给不可写属性赋值
"use strict";
var obj1 = {};
Object.defineProperty(obj1, "a", {num:7, writable:false});
obj1.a = 10; // TypeError: Cannot assign to read only property 'a' of object '#<Object>'
- 严格模式下禁止删除变量,一般模式下则会忽略这个删除语句。
"use strict";
var a = 1;
delete a; // SyntaxError: Delete of an unqualified identifier in strict mode.
console.log(a);
- 严格模式下要求函数的参数名必须唯一(不可重复)。
function sum(a, a, b) {
"use strict";
return a + a + c;
}
// SyntaxError: Duplicate parameter name not allowed in this context
- 严格模式禁止八进制数字语法(八进制以数字0开头)。
"use strict";
var a = 015; // SyntaxError: Octal literals are not allowed in strict mode.
console.log(a);
- 严格模式下,eval 不能用作变量。
"use strict";
var eval = 10;
console.log(eval); // SyntaxError: Octal literals are not allowed in strict mode.
- 为了向将来Javascript的新版本过渡,严格模式新增了一些保留关键字:
implements
、interface
、let
、package
、private
、protected
、public
、static
、yield
。使用这些词作为变量名将会报错(一般模式下,这些词是可以作为变量名的)。
"use strict";
var implements = "xkd";
console.log(implements); // SyntaxError: Unexpected strict mode reserved word