严格模式详解

 

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.语法和行为的改变

  4.1禁止使用没有声明的变量(在普通模式中没有声明就赋值的变量默认是全局变量);

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

 

  8.函数必须声明在顶层(然而我运行后是没有报错的,是现在的浏览器都支持了么)

    将来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 }

这是宝宝看到别人的文章后自己实践了一下发现有些问题,就自己半应用半用自己的实践结果的总结,还有一些其他的自己没有用到就没有写

http://www.cnblogs.com/ranzige/p/3564113.html参考地址

 

posted on 2017-03-06 17:41  sunnie_c  阅读(667)  评论(0编辑  收藏  举报