JavaScript严格模式说明带示例

严格模式(use strict)

目的

  1. 消除JS中一些不合理、不严谨之处,减小一些怪异行为
  2. 消除代码中的一些不安全之处,保障代码运行安全
  3. 提升编译器效率,增长运行速度
  4. 为之后的JS新规范作铺垫

兼容性

FF、Chrome、IE10+、Safari、Operajavascript

语法

"use strict";
老版本浏览器将以上源码当作字符串处理java

使用范围

  1. 在整个脚本以前调用,整段脚本以严格模式执行
<script>
    "use strict";
    console.log('全局严格模式');
    </script>
  1. 在函数内部以前调用,整个函数以严格模式执行
function fn() {
        "use strict";
        console.log('局部严格模式,只在函数内有效');
    }

对行为和语法的控制

  1. 全局变量显示声明
    • 正常模式下,变量没有声明,直接赋值,默认为全局变量;
    • 严格模式禁止这种行为,全局变量必须用var显式声明
    //正常模式下
     a = 1;
     console.log(a);//1
    //严格模式下
     "use strict";
     a = 1;
     console.log(a);//报错
  2. 禁止使用with
    width语句在编译时没法肯定属性归属于哪一个对象
  3. 增长eval做用域
    • 正常模式下,eval中执行的做用于取决于它处于全局仍是函数做用域内;
    • 严格模式下,eval自己有独立的做用域
    //正常模式下
     var a = 1;
     console.log(eval('var a = 1;a'));//2
     console.log(a);//2
    //严格模式下
     var a = 1;
     console.log(eval('var a = 2;a'));//2
     console.log(a);//1
  4. this默认不指向全局对象window
    • 正常模式下,this指向window
    • 严格模式下,this再也不默认指向window
    //正常模式下
     function fn() {
         this.a = 1;
     }
     fn();
     a;//1
    //严格模式下
     "use strict";
     function fn() {
         this.a = 1;
     }
     fn();
     a;//报错
  5. argumentscaller被禁用
    • 正常模式下,函数自己拥有默认属性arguments指向传递的参数,caller指向函数引用;
    • 严格模式下,argumentscaller被禁用,报错
  6. 禁止删除变量
    • 正常模式下,delete能够删除定义的变量;
    • 严格模式下,只有configurabletrue的对象属性才能被删除,var定义的变量不能被删除
    //正常模式下
     var a = 1;
     delete a;//a不会被删除,也不报错
     a;//1
     var obj = {
         o1: 1,
         o2: 2
     };
     delete obj.o1;//obj中o1属性被删除
     obj.o1;//undefined;
    //严格模式下
     "use strict";
     var a = 1;
     delete a;//报错
     a;//1
     var obj = {
         o1: 1,
         o2: 2
     };
     delete obj.o1;
     obj.o1;//undefined;
  7. 对只读属性赋值,会报错
    • 正常模式下,对只读属性赋值时,不报错,只默认失败;
    • 严格模式下,报错
  8. getter方法赋值报错
  9. 对禁止扩展的对象添加新属性报错
  10. 删除不可删除的属性报错
  11. 对象不能有重名属性
    • 正常模式下,对象中重名属性会被后面的重名属性覆盖;
    • 严格模式下,语法错误,不会报错
  12. 函数不能有重名参数
    • 正常模式下,函数下有重名参数时,正常输出参数,重名参数被后面的重名参数覆盖,使用arguments输出时,可区分参数值;
    • 严格模式下,报错
    //正常模式下
    function fn(a, a, b) {
        console.log(a);
        console.log(arguments[0]);
        console.log(arguments[1]);
    }
    fn(1,2,3);//2 1 2
    //严格模式下
    "use strict";
    function fn(a, a, b) {
        console.log(a);
        console.log(arguments[0]);
        console.log(arguments[1]);
    }
    fn(1,2,3);//报错
  13. 禁用八进制
    • 正常模式下,整数第一位若是是0,表示八进制,可正常转换输出对应的十进制数;
    • 严格模式下,报错
    //正常模式下
    console.log(012);//10
    //严格模式下
    'use strict';
    console.log(012);//报错
  14. 不容许对arguments赋值
    • 正常模式下,可对arguments从新赋值;
    • 严格模式下,语法错误,参数值不会变
  15. 再也不对arguments跟踪变化
    • 正常模式下,函数参数值发生变化时,arguments也随之变化;
    • 严格模式下,不变
    //正常模式下
    function fn(a, b, c) {
        arguments[1] = 4;
        console.log(a, b, c);//1, 4, 3
        console.log(arguments[1]);//4
    }
    fn(1, 2, 3);
    //严格模式下
    'use strict';
    function fn(a, b, c) {
        arguments[1] = 4;
        console.log(a, b, c);//1, 2, 3
        console.log(arguments[1]);//4
    }
    fn(1, 2, 3);
  16. arguments.callee被禁用
    • 正常模式下,arguments.callee指向函数引用;
    • 严格模式下,被禁用,报错
    //正常模式下
    function fn(a) {
        console.log(arguments.callee);
    }
    fn(1);//输出原函数体
    //严格模式下
    'use strict';
    function fn(a) {
        console.log(arguments.callee);
    }
    fn(1);//报错
  17. 函数必须被声明在顶层
    • 正常模式下,函数能够被声明在iffor代码块内;
    • 严格模式下,不容许,报错
    //正常模式下
    if(true) {
        function fn(a) {
            console.log(a);
        }
    }
    fn(1);//1
    //严格模式下
    'use strict';
    if(true) {
        function fn(a) {
            console.log(a);
        }
    }
    fn(1);//报错,函数不存在
  18. 新增保留字
    • 严格模式下,新增关键字implementsinterfaceletpackageprivateprotectedpublicstaticyield
相关文章
相关标签/搜索