JavaScript严格模式use strict的介绍
作者:一碗周
1.概述
1.1严格模式是什么
严格模式是JavaScript
中的一种限制性更强的变种方式。严格模式并不是JavaScript
中的子集,它在语义上与正常的代码有明显的差异。
虽然说现在大部分浏览器都已经支持严格模式,但是还是有部分老版本的浏览器不支持严格模式,所以不要在未经严格模式特性测试情况下使用严格模式。
JavaScript
中的严格模式与非严格模式可以共存,所以在脚本中可以选择性的加入严格模式。
1.2严格模式的目的
使用严格模式的目的如下所示:
首先,严格模式会将JavaScript
陷阱直接变成明显的错误。
其次,严格模式修正了一些引擎难以优化的错误:同样的代码有些时候严格模式会比非严格模式下更快。
严格模式禁用了一些可能在未来版本定义的语法。
2.开启严格模式
JavaScript
中开启严格模式分为两种,分别是全局开启严格模式和局部开启严格模式。
2.1全局开启严格模式
开启全局严格模式只需要在所有的代码前面输入一段字符串,字符串如下:
"use strict";//或者'use strict';
需要注意的是,如果之前的JavaScript
代码是非严格模式的话,建立是不要为这段代码开启严格模式,这样可能会出现问题。建议先从局部开启严格模式,一步一步的调整代码。
2.2局部开启严格模式
局部开启严格模式可以在某个指定的函数中的第一行加入"use strict
";这段字符串,这个函数体外还是非严格模式。
开启严格模式的实例代码如下所示:
//全局开启严格模式 //"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关键字声明的变量。当在严格模式下,如果意外创建全局变量,将会抛出异常,
示例代码如下所示:
'use strict' //在非严格模式下,这样创建变量将不会报错,但是在严格模式下这样创建变量将会抛出异常 v = 100 console.log(v)
3.2静默失败转为异常
所谓静默失败就是既不报错也没有任何效果,在严格模式下将会转为异常。
3.3禁用delete关键字
在非严格模式下,对全局变量使用delete关键字将会出现静默失败,而在严格模式下,将会抛出异常,示例代码如下所示
'use strict' var v = 100 delete v // SyntaxError:Deleteofanunqualifiedidentifierinstrictmode. console.log(v)
3.4对变量名的限制
在严格模式下,JavaScript
对变量名也有限制,特别是不能使用保留字作为变量名,使用保留字作为符作为变量名会导致语法错误。
4.严格模式中的对象
4.1不可删除的属性
在非严格模式下,对不可删除的属性使用delete
关键字将会出现静默失败,而在严格模式下,将会抛出异常。
示例代码如下所示:
"use strict" delete Object.prototype;//抛出异常
4.2只读属性的赋值
在非严格模式下,对一个只读的属性进行赋值操将会静默失败,但是在严格模式下将会抛出异常,示例代码如下:
'use strict' var obj = {} Object.defineProperty(obj, 'name', { value: '一碗粥', }) obj.name = '一碗周' //抛出异常
4.3不可扩展的对象
在非严格模式下,为不可扩展的对象添加新的属性将会静默失败,而在严格模式下将会抛出异常。
示例代码如下所示:
//开启全局严格模式 'use strict' var obj = {} //将悐变成不可扩展的 Object.preventExtensions(obj) //为对象扩展属性 obj.name = '一碗周' // 抛出异常
5.严格模式中的函数
5.1参数名必须唯一
在非严格模式下,函数的形参可以重复,但是在严格模式中,如果函数的形参重复将会抛出异常,示例代码如下所示:
'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'
对象是完全独立的。
示例代码如下所示:
'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
属性,结果为当前函数名称,而在严格模式中,使用此属性将会抛出异常。
示例代码如下:
'usestrict' functionfun(){ console.log(arguments.callee); } fun()//抛出异常
5.4函数声明的限制
在严格模式下,只能在全局作用域和局部作用域中声明函数,除这两种作用域外声明函数语法是错误的(例如if语句块)。
示例代码如下所示:
'use strict' function fun() { console.log(arguments.callee) } fun() //抛出异常
6.增加eval()作用域
在严格模式下,使用eval()
函数创建的变量只能在函数内部使用。
在外部使用将会抛出异常,示例代码如下:
'use strict' eval('var v=100') console.log(v) //抛出异常
7.抑制this
在非严格模式下使用Fucntion
的apply()
或者call()
方法时,null
或者undefined
值会被转换为全局对象。而严格模式下,函数的this
值始终是指定的值。
示例代码如下所示:
//开启严格模式 'use strict' var v = 100 function fn() { console.log(this.v) } var obj = { v: 200, } fn.call(obj) //this指向全局对象
结语:
本篇文章基本将严格模式的所有情况大致都有所介绍,解决日常开发中关于严格模式的问题足以应对。
到此这篇关于JavaScript
严格模式use strict
的介绍的文章就介绍到这了,更多相关JavaScript严格模式use strict内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!