1. JavaScript中存在两种模式:正常模式和严格模式。
2. ES5新添加了严格模式,目的:
1)消除js语法的一些不合理、不严谨之处、减少一些怪异行为;
2)消除代码运行的一些不安全之处,保证代码运行的安全;
3)提高编译器效率,增加运行速度;
4)为未来新版本的js做好铺垫
3. 严格模式的标志:"use strict"。
4. 严格模式的两种调用方法
1)针对整个脚本文件
<script>
//严格模式
//将"use strict"放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。
"use strict";
console.log("这是严格模式。");
//以上写法不利于文件合并,所以更好的做法是将整个脚本放在一个立即执行的匿名函数中
(function () {
"use strict";
// some code here
})();
</script>
<script>
//正常模式
console.log("这是正常模式。");
</script>
2)针对单个函数体
//将"use strict"放在函数体的第一行,则整个函数以"严格模式"运行。
function strict() {
"use strict";
return "这是严格模式。";
}
function notStrict() {
return "这是正常模式。";
}
5. 严格模式和正常模式的语法和行为上的不同。
5.1正常模式下,变量没有声明就赋值,默认是全局变量,而严格模式下,会直接报错。严格模式禁止这种用法,全局变量必须显示声明。
+ function () {
"use strict"
a = 1; //Uncaught ReferenceError: a is not defined
}()
+ function () {
a = 1; //window.a
}()
5.2 严格模式下,在某些情况只允许静态绑定。
1)禁止使用with语句,因为with语句无法在编译时就确定,属性到底归属哪个对象。
2)创建eval作用域
//禁止使用with
var v = 1;
var obj = {};
with(obj) {
v = 2;
} // Uncaught SyntaxError: Strict mode code may not include a with statement
//正常模式下,JS语言有两种变量作用域:全局作用域和函数作用域;
//严格模式下会创建第三种作用域:eval作用域。
+function(){
//正常模式下,eval作用域取决于它所处的作用域
console.log("正常模式")
var a = 1;
console.log(eval("var a = 3;a")); //3
console.log(a); //3
}()
+function(){
//严格模式下,eval语句本身就是一个作用域,不能再生成全局变量了,它所生成的变量只能用于eval内部
"use strict"
var a = 1;
console.log(eval("var a = 3;a")); //3
console.log(a); //1
}()
5.3 增强的安全措施
5.3.1 禁止this关键字指向全局对象
5.3.2 禁止在函数内部遍历调用栈
5.4 禁止删除遍历
5.5 显式报错
1)正常模式下,对一个对象的只读属性赋值,不会报错,只会默默失败。严格模式下,将报错。
2)严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。
3)严格模式下,对禁止扩展的对象添加新属性,会报错。
4)严格模式下,删除一个不可删除的属性,会报错。
5.6 重名报错
1)对象不能有重名的属性
2)函数不能有重名的参数
5.7 禁止八进制的前缀为0的表示法
5.8 arguments对象的限制
1)不允许对arguments赋值
2)arguments不再追踪参数的变化
3)禁止使用arguments.callee,无法在内部函数调用自身了
5.9 函数必须声明在顶层,即严格模式只允许在全局作用域或函数作用域顶层声明函数。
5.10 保留字作为变量名会报错。