zoukankan      html  css  js  c++  java
  • 严格模式详解

    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参考地址

  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/sunnie-cc/p/6511115.html
Copyright © 2011-2022 走看看