资讯专栏INFORMATION COLUMN

JavaScript之“use strict”

econi / 3138人阅读

摘要:在严格模式中,当运算符后跟随非法的标识符比如变量函数函数参数时,将会抛出一个语法错误异常在非严格模式中,这种表达式什么也没做,并返回。

JavaScript之“use strict”

“use strict"是ECMAScript 5引入的一条指令。
指令不是语句(但非常接近于语句)。“usestrict"指令和普通的语句之间有两个重要的区别:

它不包含任何语言的关键字,指令仅仅是一个包含一个特殊字符串直接量的表达式(可以是使用单引号也可以使用双引号),对于那些没有实现ECMAScript 5的JavaScript解释器来说,它只是一条没有副作用的表达式语句,它什么也没做。将来的ECMAScript标准希望将use用做关键字,这样就可以省略引号了。

它只能出现在脚本代码的开始或者函数体的开始、任何实体语句之前。但它不必一-定出现在脚本的首行或函数体内的首行,因为“use strict" 指令之后或之前都可能有其他字符串直接量表达式语句,并且JavaScript的具体实现可能将它们解析为解释器自有的指令。在脚本或者函数体内第一条常规语句之后字符串直接量表达式语句只当做普通的表达式语句对待;它们不会当做指令解析,它们也没有任何副作用。

使用“use strict" 指令的目的是说明(脚本或函数中)后续的代码将会解析为严格代码(strict code)。如果顶层(不在任何函数内的)代码使用了“use strict" 指令,那么它们就是严格代码。如果函数体定义所处的代码是严格代码或者函数体使用了“use strict"指令,那么函数体的代码也是严格代码。如果eva1()调用时所处的代码是严格代码或者eval()要执行的字符串中使用了“scrict code”指令,则eval()内的代码是严格代码。

严格代码以严格模式执行。ECMAScript 5中的严格模式是该语言的一个受限制的子集,它修正了语言的重要缺陷,并提供健壮的查错功能和增强的安全机制。
严格模式和非严格模式之间的区别如下(前三条尤为重要) :

在严格模式中禁止使用with语句。

在严格模式中,所有的变量都要先声明,如果给一个未声明的变量、函数、函数参数、catch从句参数或全局对象的属性赋值,将会抛出一个引用错误异常(在非严格模式中,这种隐式声明的全局变量的方法是给全局对象新添加一一个新属性)。

在严格模式中,调用的函数(不是方法)中的一个this值是undefined。(在非严格模式中,调用的函数中的this值总是全局对象)。可以利用这种特性来判断JavaScript实现是否支持严格模式:

var hasstrictMode = (function() { "use strict"; return this==undefined}());

同样,在严格模式中,当通过call()或app1y()来调用函数时,其中的this值就是通过call()或apply()传入的第一个参数(在非严格模式中,null和undefined值被全局对象和转换为对象的非对象值所代替)。

在严格模式中,给只读属性赋值和给不可扩展的对象创建新成员都将抛出-一个类型错误异常(在非严格模式中,这些操作只是简单地操作失败,不会报错)。

在严格模式中,传人eval()的代码不能在调用程序所在的上下文中声明变量或定义函数,而在非严格模式中是可以这样做的。相反,变量和函数的定义是在eval()创建的新作用域中,这个作用域在eval()返回时就弃用了。

在严格模式中,函数里的arguments对象(见8.3.2节) 拥有传入函数值的静态副本。在非严格模式中,arguments对象具有 “魔术般”的行为,arguments 里的数组元素和函数参数都是指向同一个值的引用。

在严格模式中,当delete运算符后跟随非法的标识符(比如变量、函数、函数参数)时,将会抛出一个语法错误异常(在非严格模式中,这种delete表达式什么也没做,并返回false)。

在严格模式中,试图删除-一个不可配置的属性将抛出一个类型错误异常(在非严格模式中,delete表达式操作失败,并返回false)。

在严格模式中,在一个对象直接量中定义两个或多个同名属性将产生-一个语法错误(在非严格模式中不会报错)。

在严格模式中,函数声明中存在两个或多个同名的参数将产生-一个语法错误(在非严格模式中不会报错)。

在严格模式中是不允许使用八进制整数直接量(以0为前缀,而不是0x为前缀)的(在非严格模式中某些实现是允许八进制整数直接量的)。

在严格模式中,标识符eval和arguments 当做关键字,它们的值是不能更改的。不能给这些标识符赋值,也不能把它们声明为变量、用做函数名、用做函数参数或用做catch块的标识符。

在严格模式中限制了对调用栈的检测能力,在严格模式的函数中,arguments.caller和arguments.callee都会抛出一个类型错误异常。严格模式的函数同样具有caller和arguments属性,当访问这两个属性时将抛出类型错误异常(有一些JavaScript的实现在非严格模式里定义了这些非标准的属性)

我是Cloudy,年轻的前端攻城狮一枚,爱专研,爱技术,爱分享。 
个人笔记,整理不易,感谢阅读、点赞和收藏。
文章有任何问题欢迎大家指出,也欢迎大家一起交流前端各种问题!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105222.html

相关文章

  • JS专题严格模式

    摘要:整个脚本文件就会以严格模式执行。函数作用域范围将放在函数体的第一行,则整个函数以严格模式运行。严格模式下,必须指明的指向对象。禁止在非函数代码块声明函数的严格模式只允许在全局作用域或函数作用域声明函数。 ECMAScript 5 引入了 strict mode ,现在已经被大多浏览器实现(从IE10开始) 一、什么是严格模式 顾名思义,JavaScript 严格模式就是让 JS 代码以...

    baukh789 评论0 收藏0
  • JavaScript严格模式介绍与总结

    摘要:严格模式的限制不允许使用未声明的变量报错未定义报错未定义不允许删除变量或对象。返回,因为指向全局对象,就是返回,因为严格模式下,的值为,所以为。 严格模式优势: 消除Javascript语法的一些不合理、不严谨之处,减少一些意外情况出现;消除代码运行的一些不安全之处,保证代码运行的安全;提高编译器效率,增加运行速度;注意,同样的代码,在严格模式中,可能会有不一样的运行结果;一些在正常模...

    fancyLuo 评论0 收藏0
  • JavaScript】面向对象严格模式

    摘要:一严格模式概述严格模式是什么在中是种限制性更强变种方式,不是个子集,在语义上与正常代码有明显得差异严格模式和非严格模式可共存,可选择性的加入严格模式严格模式的目的将把陷阱直接变为明显错误修正一些引擎难以优化错误,代码有些时候严格模式会比非严 JS(JavaScript)一.严格模式1.概述 严格模式是什么 在JS中是种限制性更强变种方式,不是个子集,在语义上与正常代码有明显得差异严格模...

    siberiawolf 评论0 收藏0
  • 1.你不知道的JavaScript-严格模式

    摘要:针对单个函数将放在函数体的第一行,则整个函数以严格模式运行。严格模式禁止这种用法,全局变量必须显式声明。严格模式下,这属于语法错误。严格模式禁止这种表示法,整数第一位为,将报错。也就是说,不允许在非函数的代码块内声明函数。 本文转自【阮一峰博客】:http://www.ruanyifeng.com/blo... 一、概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:...

    FuisonDesign 评论0 收藏0

发表评论

0条评论

econi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<