严格模式是干什么的?它从哪里来?

ECMAScript5中引入了严格模式。它为JS定义了一种不同的解析和执行模型。

摘自阮一峰博客:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

  • 消除JS语法的不合理之处,减少一些怪异行为
  • 消除代码运行的一些不安全支出,保证代码安全
  • 提高编译器效率,增加运行速度
  • 为未来新版本的JS做好铺垫。

正所谓未雨绸缪,JS如今的发展确实是有根源的。从这里做好铺垫我们可以看到JS的野心。

如何开启严格模式?

  • 全局开启:"use strict";//可在开头加入,则在整个脚本(从某个script标签开始到其闭合,下一个script还是正常模式)开启严格模式

必须在开头加,在其他地方加无效。

(严格地说,只要前面不是产生实际运行结果的语句,"use strict"可以不在第一行,比如直接跟在一个空的分号后面。)

  • 局部开启:function doSomething(){"use strict";}

可在函数体内部的头部加入,局部开启严格模式

更严谨的代码,严格模式实例?

以下代码跑在 Node 6.10.0下。

  • 1.在严格模式下,初始化未经声明的变量会导致错误。

    haha = 8; // 没有报错
    "use strict";
    haha = 8; // 报错,直接不让往下运行了。
    "use strict";
    for (i = 0; i < 8; i++) {
    console.log(i);
    } // 报错
  • 2.在严格模式下,不能定义名为eval或者arguments的变量,否则会导致语法错误。

    按照规则,关键字作为语言保留,不能作标识符,严格模式下的保留字也有所不同。

    "use strict";
    const eval = 8; // 报错。
  • 3.静态绑定。JS的一个语言特点,就是允许"动态绑定".某些属性和方法到底属于哪一个对象,不是在编译的时候确定的,而是在运行的时候确定的。严格模式下,只允许静态绑定

    • 禁止使用 with - with无法在编译时确定属性归属于哪个对象。
    const o = {
    name: 'haha',
    age: 4
    }
    const nowName = o.name; // haha
    const nowAge = o.age; // 4
    // 上面这个的简写其实就是 with 的效果 - 实现对象的引用从而简化代码
    // ES3之后已经不需要它了,在它里面是不能用 const 的。。。忽略它吧它吧它吧
    with(o) {
    var myName = name; // haha
    var myAge = age; // 4
    }
    console.log(nowName, myName, nowAge, myAge);
    • 创设 eval 作用域

    正常模式下,JS有两种作用域,全局作用域和函数作用域。严格模式创设了第三种。

    想一想,这样的话是不是更安全了呢?防止全局字符串被解析为JS,防止注入.

    eval("var x = 3");
    console.log(x); // 3
    "use strict";
    eval("var x = 3");
    console.log(x); // 报错:x is not defined
  • 4.禁止this关键字指向全局对象

    function test () {
    return !!this;
    }
    console.log(test()); // true - 此时 this 指向全局 !!this 为 true
    "use strict";
    function test () {
    return !!this;
    }
    console.log(test()); // false - 此时 this 为 undefined,因为严格模式下不允许其指向全局
  • 5.八进制字面量在严格模式下是没有用的,报错(大多数,99%的博客都说没法用八进制,其实可以用0o12表示八进制,不能用的是012不能用罢了)

    0oxx表示法可用,直接用0xx无法用

    const a = 012;
    console.log(a); // 10
    "use strict";
    const a = 012;
    console.log(a); // 报错
  • 6.禁止删除变量

    只有configurable设置为true的对象属性才能被删除。

    "use strict";
    const x = 3;
    delete x; // 报错
    "use strict";
    const o =Object.create(null, {
    'x': {
    value: 1,
    configurable: true
    }
    });
    delete o.x; // configurable 为 true,可删除

complete

最新文章

  1. JavaWEB 通过Listener理解域对象生命周期
  2. livezilla账号或密码修改方法
  3. leetcode 111
  4. [QTP/UFT12]无限延长试用期的方法
  5. Linux Path文件夹内容
  6. JS数组(Array)处理函数总结
  7. 阿里云ubuntu搭建SVN服务器
  8. 正则Match
  9. NopCommerce架构分析之五------Model绑定Action参数
  10. poj2909 || poj2262
  11. BZOJ3231(矩阵连乘,稍有点复杂)
  12. Extjs 4.2 右键菜单树节点(,选择逆,废除)
  13. hdu2546 01背包 重学背包
  14. Python内置函数(24)——set
  15. Verilog语言实现并行(循环冗余码)CRC校验
  16. C++11 override 和 final 关键字
  17. 集腋成裘-01-html -html基础
  18. SharePoint 2013 APP 开发示例 (四)JQuery访问REST
  19. GitHub下载安装以及开源项目
  20. Java 8- Java 分支结构 - if…else/switch

热门文章

  1. php中socket的使用
  2. CI中控制器名不能和本个 控制器中的方法名相同
  3. Nginx开启关闭脚本,php-cgi脚本
  4. bzoj 2434: 阿狸的打字机 fail树+离线树状数组
  5. 【Lintcode】363.Trapping Rain Water
  6. 使用Visual Studio进行单元测试-Part1
  7. vmware的双网卡以及Pro的注册码
  8. form+iframe实现ajax文件上传
  9. 【转】 Pro Android学习笔记(七七):服务(2):Local Service
  10. 办公软件-Excel:Excel百科