关于JS中的严格模式

1、概述

  除了正常模式,ECMAscript 5添加了第二种运行模式:“严格模式”(strict mode)。顾名思义,这种模式使得javascript在更严格的条件下运行。

 

2、为什么要用严格模式?

  - 消除javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

  - 消除代码运行的一些不安全之处,保证代码运行的安全;

  - 提高编译效率,增加运行速度;

  - 为未来新版本的javascript做好铺垫。

  “严格模式”体现了javascript更合理、更安全、更严谨的发展方向,包括IE10在内的主流浏览器都已经支持它,许多大项目已经开始全面拥抱它。

  另一方面,一些在“正常模式”下可以运行的代码,在“严格模式”下,可能将不能运行。

 

3、进入标志

  “use strict”;

 

4、如何调用

  - 针对单个脚本

    <script>

      "use strict";

      console.log("这是严格模式");

    </script>

  - 针对单个函数

    function strict(){

      "use strict";

      return "这是严格模式";

    }

    function noStrict(){

      return "这是正常模式";  

    }

 

5、语法和行为的改变

  - 全局变量显式声明

    在正常模式下,如果一个变量没有声明就赋值,默认为全局变量;在严格模式下禁止这样做,全局变量必须显式声明。

    “use strict”;

    v=1;  /*报错,v未声明*/

    for(i=0;i<2;i++){

      /*报错,i未声明*/

    }

 

  - 禁止this关键字指向全局对象

    function fn(){

      return !this;  /*返回false,因为“this”指向全局对象,“!this”就是false;*/

    }

    function fn(){

      "use strict";

      return !this;  /*返回true,因为严格模式下,this的值为undefined,所以“!this”为true;*/

    }

    因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。

    function fn(){

      "use strict";

      this.num=1;

    }

    fn();  /*报错,this未定义*/

 

  - 禁止删除变量

    严格模式下,无法删除变量。只有configurable设置为true的对象属性,才能被删除。

    “use strict”;

    var x;

    delete x;  /*语法错误*/

    var o=Object.create(null,{'x':{

      value:1;

      configurable:true;

    }})

    delete o.x;  /*删除成功*/

 

  - 对象不能有重名的属性

    正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。在严格模式下,这属于语法错误。

    “use strict”;

    var fn={

      a:1,

      a:2  /*语法错误*/

    }

 

  - 函数不能有重名的参数

    正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取,严格模式下,这属于语法错误。

    “use strict”;

    function fn(a,a,b){  /*语法错误*/

      return ..

    }

posted @ 2016-08-31 09:46  北落′  阅读(909)  评论(0编辑  收藏  举报