美文网首页
严格模式和非严格模式

严格模式和非严格模式

作者: RangoFu | 来源:发表于2019-02-13 14:14 被阅读0次

    es6添加了严格模式("use strict")
    主要作用:

    1.严格模式通过抛出错误来消除一些原有的静默错误。
    2.提高编译效率,提高运行速度
    3.为未来新版本ECMAScript兼容做铺垫

    如何使用:

    1.在脚本中使用
    <script type="text/javascript">
        "use strict"
        // do something
    </script>
    
    2.在函数中使用
    function foo(){
        "use strict"
        //  do something
    }
    
    // 更加通用的写法,自执行函数(有三种写法参考:https://www.jianshu.com/p/224a92f8c762)
    (function(){
        "use strict"
        // do something
    }())
    

    语法:

    1.不允许使用with
    !function(){
        "use strict";
        with({a: 1}){
            console.log(a);  // Uncaught SyntaxError: Strict mode code may not include a with statement
        }
    }
    

    with个人理解为:在存取对象属性和调用方法时不用重复指定对象,参考:https://blog.csdn.net/zwkkkk1/article/details/79725934

    2.不允许给未声明的变量赋值
    (function(){
        "use strict";
        a=2; // ReferenceError
    }())
    
    3.严格模式下,arguments变为参数的静态副本。非严格模式下,arguments对象里的元素和对应的参数是指向同一个值的引用。
    !function(a) {
        "use strict";
        arguments[0] = 10;
        console.log(a);  // 严格模式(下面简称严):1,非严格模式(下面简称 非严):10
    }(1);
    

    但是,如果实参是对象除外。

    !function(a) {
        "use strict";
        console.log(a.x);  // 结果都为:1
        arguments[0].x = 10;
        console.log(a.x);  // 结果都为:10
    }({x: 1});
    
    4.严格模式下,删除参数名,函数会报错。非严格模式下,返回false。不报错也没有作用。
    !function(a) {
        console.log(a);  //1
        console.log(delete a);  //false
        console.log(a);  //1
    }(1);
    
    !function(a) {
        "use strict";
        console.log(a);  //1
        delete a;  //SyntaxError
        console.log(a);  //1
    }(1)
    
    5.严格模式下,函数参数名重复报错。非严格模式最后一个重名参数会覆盖之前的重名参数。
    !function (a, a, b) {
        "use strict";
        console.log(a + b);  // 严:SyntaxError,非严:5
    }(1, 2, 3);
    
    6.对象字面量重复属性名部分浏览器报错。
    !function() {
         var obj = { x: 1, x: 2 };
         console.log(obj.x);  //2
     }();
            
    !function() {
        "use strict";
        var obj = { x: 1, x: 2 };  
        console.log(obj.x);  //IE10+报错。IE7~9、Chrome、FF不报错,结果为:2
    }();
    
    7.严格模式下,删除不可配置(configurable=false)的属性报错。非严格模式,但会false,静默失败。
    !function (a){
        "use strict";
        var obj={};
        Object.defineProperty(obj, 'a', { configurable: false });
        console.log(delete obj.a); //严:TypeError, 非严:flase
    }(1);
    
    8.修改不可写(writable=false)的属性报错。
    !function(){
        "use strict"
        let obj = {a: 1};
        Object.defineProperty(obj, 'a', {writable: false});
        obj.a = 2;  // 严:TypeError;非严:结果为1,没有被修改
        console.log(obj.a);
    }()
    
    9.给只读属性赋值报错。
    !function () {
        "use strict";
        var obj = { get x() { return 17; } };
        obj.x = 5;  //TypeError
    }();
    
    10.禁止使用八进制字面量
    !function(){
        "use strict";
        let t = 023;
        console.log(t); // 严:SyntaxError,非严:19
    }()
    
    11.eval, arguments成为关键字,不能用作变量,函数名。
    // eval() 函数可用于执行字符串,并执行其中的JS代码,eg:
    eval("2+2") // 4
    
    // 待举例子
    
    12.eval变成了独立作用域。
    !function() {
        "use strict";
        eval('var evalVal = 2;');
        console.log(typeof evalVal);  // 严:undefined,非严:number
    }();
    
    13.一般函数调用,this指向undefined,而不是全局对象。
    (function(){
       "use strict";
       function foo(){ return this; }
       console.log(foo());  // undefined
    }())
    

    其他不常用到的就不说了。
    参考链接:
    https://blog.csdn.net/qq_41139830/article/details/80543424

    相关文章

      网友评论

          本文标题:严格模式和非严格模式

          本文链接:https://www.haomeiwen.com/subject/cptdeqtx.html