• JavaScript严格模式说明带示例


    严格模式(use strict)

    目的

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

    兼容性

    FF、Chrome、IE10+、Safari、Opera

    语法

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

    使用范围

    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);//报错
    
    1. 禁止使用with
      width语句在编译时无法确定属性归属于哪个对象
    2. 增加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
    
    1. this默认不指向全局对象window
      • 正常模式下,this指向window
      • 严格模式下,this不再默认指向window
        //正常模式下
        function fn() {
            this.a = 1;
        }
        fn();
        a;//1
    
        //严格模式下
        "use strict";
        function fn() {
            this.a = 1;
        }
        fn();
        a;//报错
    
    1. argumentscaller被禁用
      • 正常模式下,函数本身拥有默认属性arguments指向传递的参数,caller指向函数引用;
      • 严格模式下,argumentscaller被禁用,报错
    2. 禁止删除变量
      • 正常模式下,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;
    
    1. 对只读属性赋值,会报错
      • 正常模式下,对只读属性赋值时,不报错,只默认失败;
      • 严格模式下,报错
    2. getter方法赋值报错
    3. 对禁止扩展的对象添加新属性报错
    4. 删除不可删除的属性报错
    5. 对象不能有重名属性
      • 正常模式下,对象中重名属性会被后面的重名属性覆盖;
      • 严格模式下,语法错误,不会报错
    6. 函数不能有重名参数
      • 正常模式下,函数下有重名参数时,正常输出参数,重名参数被后面的重名参数覆盖,使用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);//报错
    
    1. 禁用八进制
      • 正常模式下,整数第一位如果是0,表示八进制,可正常转换输出对应的十进制数;
      • 严格模式下,报错
        //正常模式下
        console.log(012);//10
    
        //严格模式下
        'use strict';
        console.log(012);//报错
    
    1. 不允许对arguments赋值
      • 正常模式下,可对arguments重新赋值;
      • 严格模式下,语法错误,参数值不会变
    2. 不再对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);
    
    1. arguments.callee被禁用
      • 正常模式下,arguments.callee指向函数引用;
      • 严格模式下,被禁用,报错
        //正常模式下
        function fn(a) {
            console.log(arguments.callee);
        }
        fn(1);//输出原函数体
    
    	//严格模式下
        'use strict';
        function fn(a) {
            console.log(arguments.callee);
        }
        fn(1);//报错
    
    1. 函数必须被声明在顶层
      • 正常模式下,函数可以被声明在iffor代码块内;
      • 严格模式下,不允许,报错
    	//正常模式下
        if(true) {
            function fn(a) {
                console.log(a);
            }
        }
        fn(1);//1
    
    	//严格模式下
        'use strict';
        if(true) {
            function fn(a) {
                console.log(a);
            }
        }
        fn(1);//报错,函数不存在
    
    1. 新增保留字
      • 严格模式下,新增关键字implementsinterfaceletpackageprivateprotectedpublicstaticyield
  • 相关阅读:
    使用discourse 作为社区工具
    dremio schema 更新的问题
    go-mysql-server 新版本发布
    开发一个dremio user_agent 解析函数
    java 几个不错的user_agent 解析工具包
    Docker Swarm 高可用详解
    用Docker Swarm实现容器服务高可用
    Docker 1.12 :认识 Swarm 模式下的节点崩溃处理
    Linux下磁盘分区调整(在不使用LVM的情况下)
    docker-swarm----多机容器管理
  • 原文地址:https://www.cnblogs.com/tian-xie/p/6400800.html
Copyright © 2020-2023  润新知