1.严格模式的好处
1.1消除javascript不合理、不严谨之处,减少怪异行为
1.2消除代码的不安全之处,保证代码的安全运行
1.3提高编译器的效率,增加运行速度
1.4为后续版本的javascript做铺垫
2.严格模式的进入标准
2.1"use strict"(老版本不支持将会忽略,变为不同模式)
3.如何调用
3.1整个脚本的调用
放在脚本的第一行将是整个脚本都是严格模式,不在第一行则无效,所以如果多个严格模式的文件合并时要注意
1 <script>
2 "use strict";//放在脚本的第一行将是整个脚本都是,不在第一行则无效
3 console.log("这是严格模式");
4 </script>
3.2单个函数的调用
1 <script>
2 (function(){
3 "use strict"
4 console.log("这是单个函数的调用");
5 })()
6 </script>
4.语法和行为的改变
在普通模式中没有声明就赋值的变量默认是全局变量);
1 <script>
2 v = 3;//报错,v没有声明
3 for(i=0;i<5;i++){}//报错,i没有声明
4 </script>
4.2静态绑定
javascript是允许"动态绑定",即某些属性和方法到底是属于那个对象,不是在编译时确定的而是在运行的时候确定的,而严格模式是不允许"动态绑定"的,也就是说在编译的时候就确定了属性和方法是属于哪个对象,
好处(这样有利于提高编译效率,代码也更容易阅读,更少出意外);
4.2.1禁止使用with
1 var col = {
2 v:4,
3 l:5
4 }
5 with(col){//with为语句指定特定的对象,严格模式下不能使用with,because无法在编译时确定属性到底属于哪个对象
6 console.log(v);//普通模式下值为4
7 }
4.2.2创建eval作用域
1 var v = 1;
2 console.log(eval("var v = 5; v;"));//在严格模式下eval本身就是一个作用域,不能再生成全局变量了
3 console.log(v);
4 //严格模式下输出5;1
5 //普通模式下输出5;5
5.增强安全措施
5.1禁止this指向全局变量
1 (function foo(){
2 "use strict"
3 console.log("show this:"+(this));//严格模式下禁止this指向全局变量,使用this会是undefined;
4 })();
5
6
7 function aa(){
8 "use strict"
9 this.a = 1;
10 }
11 aa(); //直接调用aa()会报错,应为此时的this是undefined
12 var bb = new aa();//this对象引用bb对象,还继承了该函数的原型
13 console.log(bb.a);//返回的是1;
6.禁止删除变量
严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。
1 "use strict";
2
3 var x;
4
5 delete x; // 语法错误
6
7 var o = Object.create(null, 'x', {
8 value: 1,
9 configurable: true
10 });
7.重名错误
7.1对象不能有重名属性
1 (function(){
2 "use strict"
3 var obj = {
4 p:1,
5 p:2
6 }
7 console.log(obj.p);//在高版本的浏览器中是可以显示2的,在低版本中会报错
8 })();
7.2函数不能有重名参数
1 function f(a,a,b){
2 "use strict"
3 a = 2;
4 return [a,arguments[0]];
5 }//Duplicate parameter name not allowed in this context
然而我运行后是没有报错的,是现在的浏览器都支持了么)
将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。
1 "use strict";
2
3 if (true) {
4
5 function f() { } // 语法错误
6
7 }
8
9 for (var i = 0; i < 5; i++) {
10
11 function f2() { } // 语法错误
12
13 }
9.保留字
为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
使用这些词作为变量名将会报错。
1 function package(protected) { // 语法错误
2
3 "use strict";
4
5 var implements; // 语法错误
6
7 }
这是宝宝看到别人的文章后自己实践了一下发现有些问题,就自己半应用半用自己的实践结果的总结,还有一些其他的自己没有用到就没有写