ES5新特性—严格模式

ES5新特性——严格模式

目的
  1. 消除语法不合理、不严谨
  2. 消除运行不安全
  3. 提高速度 ?
  4. 新版本模块化做铺垫
 语法
    "use strict"//是一个指令,指示解释器用更严格的方式检查代码
如何调用
  1. 针对整个脚本文件:放在脚本文件的第一行
    <script>
        "use strict"
        a = 3
        console.log(a) //报错
    </script>
    <script>
        b = 4
        console.log(b) //4
    </script>
  1. 针对单个函数:放在函数体的第一行
  2. 脚本文件变通写法:将整个脚本文件放在一个立即执行的匿名函数中
 限制
  1. 全局变量
    • 变量必须声明后再使用
  2. 属性和方法在编译阶段就能确定属于那个对象;有利于编译效率的提高。
    • 禁止使用with语句 ; 因为with无法在编译时就确定属性到底归属于哪个对象
    • 创设eval作用域;不能生成全局变量,他所生成的变量只能用于eval内部
    //with
    var o = {name:'张三'}     
    with (o){
        console.log(name)
    }

    //eval
    var code = "var a = 3;console.log(a)"
    eval(code)
  1. 增强的安全措施
    • 禁止使用this关键字指向全局对象
    function f() {
        "use strict";
        this.a = 1;
    }
    f(); // 报错,this未定义
    var f1 = new f();
    console.log(f1.a);
  • 禁止在函数内部遍历调用栈
    function f() {
        "use strict";
        f1.caller;  // 报错
        f1.arguments; // 报错
    }
  1. 禁止删除变量:只有configurable设置为true的对象属性,才能被删除
    "use strict";
    var x;
    delete x; // 语法错误
    var o = Object.create(null, {'x': {
        value: 1,
      configurable: true
    }});
    delete o.x; // 删除成功
  1. 显性报错
    • 正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错
    "use strict";
    var o = {};
    Object.defineProperty(o, "v", { value: 1, writable: false });
    o.v = 2; // 报错
  • 严格模式下,对一个使用getter方法读取的属性进行赋值,会报错
    "use strict";
    var o = {
        get v() { return 1; }
    };
    o.v = 2; // 报错
  • 严格模式下,对禁止扩展的对象添加新属性,会报错
    "use strict";
    var o = {};
    Object.preventExtensions(o);
    o.v = 1; // 报错
  • 严格模式下,删除一个不可删除的属性,会报错
    "use strict";
    delete Object.prototype; // 报错
  1. 重名错误:
    • 对象不能有重名的属性:正常模式下最后赋值的属性会覆盖前面的值,严格模式下属于语法错误;
    • 函数不能有重名的参数;
  2. 禁止八进制表示法:
    • 正常模式下,整数的第一位如果是0,表示这是八进制数,比如 0100 等于10进制的64。严格模式下禁止这种表示法,将报错。
  3. arguments对象的限制
    • 不允许对arguments赋值;
    • arguments不再追踪参数的变化;
    • 禁止使用arguments.callee:意味这无法在匿名函数内部调用自身了。
  4. 函数必须生命在顶层
    • 严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。
    "use strict";
    if (true) {
        function f() { } // 语法错误
    }
    for (var i = 0; i < 5; i++) {
        function f2() { } // 语法错误
    }
  1. 保留字
    • 严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。使用这些词作为变量名将会报错;

参考网址: 阮一峰严格模式详解

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值