严格模式

除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict mode)。顾名思义,这种模式采用更加严格的 JavaScript 语法

同样的代码,在正常模式和严格模式中,可能会有不一样的运行结果。

一些在正常模式下可以运行的语句,在严格模式下将不能运行。

  • 设计目的

    • 早期的 JavaScript 语言有很多设计不合理的地方,但是为了兼容以前的代码,又不能改变老的语法,
    • 只能不断添加新的语法,引导程序员使用新语法
    • 严格模式是从 ES5 进入标准的,主要目的有以下几个。
      • 明确禁止一些不合理、不严谨的语法,减少 JavaScript 语言的一些怪异行为
      • 增加更多报错的场合,消除代码运行的一些不安全之处,保证代码运行的安全
      • 提高编译器效率,增加运行速度
      • 为未来新版本的 JavaScript 语法做好铺垫
  • 启用方法

进入严格模式的标志,是一行字符串 use strict;

  • 'use strict';
    • 在整个脚本文件 启用

      • 放在脚本文件的第一行,整个脚本都将以严格模式运行。
      • <script>
        'use strict';
        console.log('这是严格模式');
        </script>

        <script>
        console.log('这是正常模式');
        </script>
    • 只在单个函数中 启用
      • use strict; 放在函数体的第一行,则整个函数以严格模式运行
    • 有时,需要把不同的脚本合并在一个文件里面。

      • 如果一个脚本是严格模式,另一个脚本不是,它们的合并就可能出错。
        • 严格模式的脚本在前,则合并后的脚本都是严格模式
        • 如果正常模式的脚本在前,则合并后的脚本都是正常模式
      • 这时可以考虑把整个脚本文件放在一个立即执行的匿名函数之中

        (function () {
        'use strict';
        // some code here
        })();
  • 显示报错

严格模式使得 JavaScript 的语法变得更严格,更多的操作会显式报错

其中有些操作,在正常模式下只会默默地失败,不会报错

    • 只读属性不可写

      • 严格模式下,设置字符串的 length 属性,会报错    // TypeError: Cannot assign to read only property 'length' of string 'abc'
      • 删除不可配置(non-configurable)属性都会报错
    • 禁止扩展的对象不可扩展

      • 严格模式下,对禁止扩展的对象添加新属性,会报错

        'use strict';
        var obj = {};
        Object.preventExtensions(obj); obj.v = 1; // Uncaught TypeError: Cannot add property v, object is not extensible
    • 严格模式下,对一个只有取值器(getter)、没有存值器(setter)的属性赋值,会报错

 

    • eval、arguments 不可用作标识名

 

    • 函数不能有重名的参数

 

    • 禁止八进制的前缀0表示法
  • 增强的安全措施

    • 全局变量必须显式声明
    • 禁止 this 关键字指向全局对象
    • 函数禁止使用 fn.callee    fn.caller
    • 禁止使用 arguments.callee、arguments.caller

      • 只有对象的属性,且属性的描述对象的 configurable 属性设置为 true,才能被 delete 命令删除
    • 禁止删除window 的变量
  • 静态绑定
        • JavaScript 语言的一个特点,就是允许 “动态绑定”,
        • 即某些属性和方法到底属于哪一个对象,不是在编译时确定的,而是在运行时(runtime)确定的。
        • 某些情况下,只允许静态绑定。也就是说,属性和方法到底归属哪个对象,必须在编译阶段就确定。
        • 这样做有利于编译效率的提高,也使得代码更容易阅读,更少出现意外。
    • 禁止使用 with 语句

      • 因为with语句无法在编译时就确定,某个属性到底归属哪个对象,从而影响了编译效果
    • 创设 eval 作用域

      • 正常模式下,JavaScript 语言有两种变量作用域(scope):全局作用域和函数作用域
      • 严格模式创设了第三种作用域:eval作用域
      • eval 所生成的变量只能用于 eval 内部
        • (function () {
          'use strict';
          var x = 2;
          console.log(eval('var x = 5; x')) //
          console.log(x) //
          })()
      • 如果希望 eval 语句也使用严格模式,有两种方式
        • // 方式一
          function f1(str){
          'use strict';
          return eval(str);
          } f1('undeclared_variable = 1'); // 报错 // 方式二
          function f2(str){
          return eval(str);
          } f2('"use strict";undeclared_variable = 1') // 报错
      • arguments 不再追踪参数的变化 
        • 变量arguments代表函数的参数。严格模式下,函数内部改变参数与arguments的联系被切断了,两者不再存在联动关系
    • 非函数代码块不得声明函数

      • 只允许在全局作用域或函数作用域声明函数
    • 保留字

      • implements、interface、let、package、private、protected、public、static、yield等

(81)Wangdao.com第十六天_JavaScript 严格模式的更多相关文章

  1. (80)Wangdao.com第十六天_JavaScript Object 对象的相关方法

    Object 对象的相关方法 Object.getPrototypeOf() 返回参数对象的原型. 这是获取某对象的原型对象的标准方法. var F = function () {}; var f = ...

  2. (82)Wangdao.com第十六天_JavaScript 异步操作

    异步操作 单线程模型 指的是,JavaScript 只在一个线程上运行 也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待 注意,JavaScript 只在一个线程上运 ...

  3. (59)Wangdao.com第十天_JavaScript 对象在 栈和堆

    对象的属性值 如果要使用特殊的属性名,需 对象["属性名"] = 属性值       // 存 对象["属性名"]       // 取 obj["1 ...

  4. (62)Wangdao.com第十天_JavaScript 变量的作用域

    在 js 中有两种作用域:全局作用域,局部作用域. 全局作用域 直接写在 <script> 标签中的变量和方法. 在网页打开时创建,在网页关闭时销毁. 全局作用域有一个全局对象 windo ...

  5. (60)Wangdao.com第十天_JavaScript 函数_作用域_闭包_IIFE_回调函数_eval

    函数        实现特定功能的 n 条语句封装体. 1. 创建一个函数对象 var myFunc = new Function(); // typeof myFunc 将会打印 function ...

  6. (61)Wangdao.com第十天_JavaScript 立即执行函数

    1. 立即执行函数 创建完了就执行,只执行完就不再执行了. ( function(){} )(); 例 ( function(a,b){ alert("Hello ,我是一个匿名函数!&qu ...

  7. (64)Wangdao.com第十天_JavaScript 对象的 toString() 方法改变输出

    JavaScript 对象的 toString() 方法改变输出 在平常,我们 console.log(对象);    // 会打印 [Object Object] 但是我们想要更详细的输出,此时,我 ...

  8. (65)Wangdao.com第十天_JavaScript 垃圾回收机制 GC

    垃圾积累过多,致使程序运行缓慢,什么是垃圾? 当堆中某个内容,再也没有指针指向它,我们将再也用不了它,此时就是一个垃圾. 出现这种情况是因为 obj = null; 此时,js 中的垃圾回收机制会自动 ...

  9. (86)Wangdao.com第十九天_JavaScript 接口之 ParentNode 和 ChildNode

    ParentNode 接口,ChildNode 接口 节点对象除了继承 Node 接口以外,还会继承其他接口. ParentNode 接口 表示当前节点是一个父节点,提供一些处理子节点的方法. Chi ...

随机推荐

  1. 大家都知道fastclick能解决300ms延迟,现在我们来看一下,使用方法

    1.在终端输入以下命令进行安装 npm install fastclick -S 2.在你用脚手架搭建好的项目中,找到mian.js这个入口文件,打开 3.在其中加入: import FastClic ...

  2. 鼠标右键添加Sublime Text

    鼠标右键添加Sublime Text 参考 将sublime添加到鼠标右键 实践 1. win+R 输入regedit 2. 输入路径: 计算机\HKEY_CLASSES_ROOT\*\shell\ ...

  3. Python不能用于大型项目?关于Python的10大误解

     语言多元化是PayPal编程文化中一个重要的组成部分.在C++和Java长期流行的同时,更多的团队选择了Jva和Scala.同时,Braintree的收购也引入了一个久经世故的Ruby社区.Pyt ...

  4. 深入理解JavaScript,这一篇就够了

    前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...

  5. Django目录

    app和ORM的操作与介绍 框架简介 中间件 form介绍 Django自带用户认证 cookie和session 模版 模板2 ORM操作 所有ORM操作(第二版) Django请求生命周期 Dja ...

  6. 【原创】大数据基础之Hive(1)Hive SQL执行过程之代码流程

    hive 2.1 hive执行sql有两种方式: 执行hive命令,又细分为hive -e,hive -f,hive交互式: 执行beeline命令,beeline会连接远程thrift server ...

  7. 【原创】Java基础之Session机制

    Session机制 JSESSIONID是Session的标识,当客户端请求服务器端的时候,服务器端会检查是否已经给这个客户端创建过Session,也就是看客户端的请求中的header是否有Cooki ...

  8. canvas图片与img图片的相互转换

    最近在一个项目中,遇到了一个问题,需要把生成的canvas形式的二维码转换为图片,可以长按识别,保存等.查找了一些资料归纳总结了一些知识. 默认在jq库里进行,引入jquery.qrcode.min. ...

  9. 【java】Java相关学习参考链接(持续更新)

    How to do in java,https://howtodoinjava.com/,Java手册,分版本,并且有每个版本的新特性的详细解析. Java World,https://www.jav ...

  10. ionic3 打包 混淆代码

    ionic3 项目中遇到安全漏洞 解决办法: https://www.npmjs.com/package/ionic-voricles-obfuscate 安装插件 cordova plugin ad ...