阅读 215

JavaScript严格模式use strict的介绍

这篇文章主要介绍了JavaScript严格模式use strict,严格模式是JavaScript中的一种限制性更强的变种方式。严格模式并不是JavaScript中的子集,它在语义上与正常的代码有明显的差异,下面我们就一起来学习该内容吧,需要的朋友也可以参考一下

目录
  • 1.概述

    • 1.1严格模式是什么

    • 1.2严格模式的目的

  • 2.开启严格模式

    • 2.1全局开启严格模式

    • 2.2局部开启严格模式

  • 3.严格模式中的变量

    • 3.1禁止意外创建变量

    • 3.2静默失败转为异常

    • 3.3禁用delete关键字

    • 3.4对变量名的限制

  • 4.严格模式中的对象

    • 4.1不可删除的属性

    • 4.2只读属性的赋值

    • 4.3不可扩展的对象

  • 5.严格模式中的函数

    • 5.1参数名必须唯一

    • 5.2arguments的不同

    • 5.3arguments.callee属性

    • 5.4函数声明的限制

  • 6.增加eval()作用域

    • 7.抑制this

      1.概述

      1.1严格模式是什么

      严格模式是JavaScript中的一种限制性更强的变种方式。严格模式并不是JavaScript中的子集,它在语义上与正常的代码有明显的差异。

      虽然说现在大部分浏览器都已经支持严格模式,但是还是有部分老版本的浏览器不支持严格模式,所以不要在未经严格模式特性测试情况下使用严格模式。

      JavaScript中的严格模式与非严格模式可以共存,所以在脚本中可以选择性的加入严格模式。

      1.2严格模式的目的

      使用严格模式的目的如下所示:

      首先,严格模式会将JavaScript陷阱直接变成明显的错误。
      其次,严格模式修正了一些引擎难以优化的错误:同样的代码有些时候严格模式会比非严格模式下更快。
      严格模式禁用了一些可能在未来版本定义的语法。

      2.开启严格模式

      JavaScript中开启严格模式分为两种,分别是全局开启严格模式和局部开启严格模式。

      2.1全局开启严格模式

      开启全局严格模式只需要在所有的代码前面输入一段字符串,字符串如下:

      1
      "use strict";//或者'use strict';

      需要注意的是,如果之前的JavaScript代码是非严格模式的话,建立是不要为这段代码开启严格模式,这样可能会出现问题。建议先从局部开启严格模式,一步一步的调整代码。

      2.2局部开启严格模式

      局部开启严格模式可以在某个指定的函数中的第一行加入"use strict";这段字符串,这个函数体外还是非严格模式。

      开启严格模式的实例代码如下所示:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      //全局开启严格模式
      //"use strict"
      v = 100
      console.log(v)
       
      function fun() {
        //局部开启严格模式
        'use strict'
        vv = 200
        console.log(vv)
      }
      // fun() 抛出异常 vv is not defined

      3.严格模式中的变量

      3.1禁止意外创建变量

      所谓的意外创建变量就是指不使用var关键字声明的变量。当在严格模式下,如果意外创建全局变量,将会抛出异常,

      示例代码如下所示:

      1
      2
      3
      4
      'use strict'
      //在非严格模式下,这样创建变量将不会报错,但是在严格模式下这样创建变量将会抛出异常
      v = 100
      console.log(v)

      3.2静默失败转为异常

      所谓静默失败就是既不报错也没有任何效果,在严格模式下将会转为异常。

      3.3禁用delete关键字

      在非严格模式下,对全局变量使用delete关键字将会出现静默失败,而在严格模式下,将会抛出异常,示例代码如下所示

      1
      2
      3
      4
      'use strict'
      var v = 100
      delete v // SyntaxError:Deleteofanunqualifiedidentifierinstrictmode.
      console.log(v)

      3.4对变量名的限制

      在严格模式下,JavaScript对变量名也有限制,特别是不能使用保留字作为变量名,使用保留字作为符作为变量名会导致语法错误。

      4.严格模式中的对象

      4.1不可删除的属性

      在非严格模式下,对不可删除的属性使用delete关键字将会出现静默失败,而在严格模式下,将会抛出异常。

      示例代码如下所示:

      1
      2
      "use strict"
      delete Object.prototype;//抛出异常

      4.2只读属性的赋值

      在非严格模式下,对一个只读的属性进行赋值操将会静默失败,但是在严格模式下将会抛出异常,示例代码如下:

      1
      2
      3
      4
      5
      6
      7
      'use strict'
       
      var obj = {}
      Object.defineProperty(obj, 'name', {
        value: '一碗粥',
      })
      obj.name = '一碗周' //抛出异常

      4.3不可扩展的对象

      在非严格模式下,为不可扩展的对象添加新的属性将会静默失败,而在严格模式下将会抛出异常。

      示例代码如下所示:

      1
      2
      3
      4
      5
      6
      7
      //开启全局严格模式
      'use strict'
      var obj = {}
      //将悐变成不可扩展的
      Object.preventExtensions(obj)
      //为对象扩展属性
      obj.name = '一碗周' // 抛出异常

      5.严格模式中的函数

      5.1参数名必须唯一

      在非严格模式下,函数的形参可以重复,但是在严格模式中,如果函数的形参重复将会抛出异常,示例代码如下所示:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      'use strict'
       
      function fun(a, a, b) {
        console.log(a + a + b)
      }
      /*
       *非严格模式下结果为7=2+2+3
       *严格模式下将会抛出异常
       */
      fun(1, 2, 3)

      5.2arguments的不同

      在严格模式和非严格模式中,arguments对象的行为是不同的

      具体不同如下所示:

      • 在非严格模式下,修改实参的值会也会反映到arguments对象中。

      • 在严格模式下,命名参数与‘arguments'对象是完全独立的。

      示例代码如下所示:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      'use strict'
       
      function fun(v) {
        v = '100'
        console.log(v)
        console.log(arguments[0])
      }
      /*
       *在非严格模式中打印的结果为100,100
       *在严格模式中打印的结果为100,200
       */
      fun(200)

      5.3arguments.callee属性

      在非严格模式中的可以使用arguments.callee属性,结果为当前函数名称,而在严格模式中,使用此属性将会抛出异常。

      示例代码如下:

      1
      2
      3
      4
      5
      6
      'usestrict'
       
      functionfun(){
      console.log(arguments.callee);
      }
      fun()//抛出异常

      5.4函数声明的限制

      在严格模式下,只能在全局作用域和局部作用域中声明函数,除这两种作用域外声明函数语法是错误的(例如if语句块)。

      示例代码如下所示:

      1
      2
      3
      4
      5
      6
      'use strict'
       
      function fun() {
        console.log(arguments.callee)
      }
      fun() //抛出异常

      6.增加eval()作用域

      在严格模式下,使用eval()函数创建的变量只能在函数内部使用。

      在外部使用将会抛出异常,示例代码如下:

      1
      2
      3
      'use strict'
      eval('var v=100')
      console.log(v) //抛出异常

      7.抑制this

      在非严格模式下使用Fucntionapply()或者call()方法时,null或者undefined值会被转换为全局对象。而严格模式下,函数的this值始终是指定的值。

      示例代码如下所示:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      //开启严格模式
      'use strict'
       
      var v = 100
       
      function fn() {
        console.log(this.v)
      }
       
      var obj = {
        v: 200,
      }
       
      fn.call(obj) //this指向全局对象

      结语:

      本篇文章基本将严格模式的所有情况大致都有所介绍,解决日常开发中关于严格模式的问题足以应对。

      到此这篇关于JavaScript严格模式use strict的介绍的文章就介绍到这了

      原文链接:https://juejin.cn/post/7035084992388530213


      文章分类
      代码人生
      版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
      相关推荐