js中的严格模式和非严格模式的比较
Posted web知识-平时工作生活中的总结
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中的严格模式和非严格模式的比较相关的知识,希望对你有一定的参考价值。
前言
es5的严格模式是采用具有限制性javascript变体的一种方式,从而使代码显示地脱离‘懒散模式/非严格模式’
严格模式
严格模式通过抛出错误来消除一些原有静默错误
严格模式修复了一些导致JavaScript引擎难以优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
严格模式禁用了在ECMAScript未来版本中可能会定义的一些语法。
开启严格模式
在整个脚本文件或者函数体开头,写入‘use strict‘
语句。
将拼写错误转成异常
无法再意外创建全局变量,会抛出错误。
ReferenceError.: *** is not defined
引起静默失败的赋值操作抛出异常。
TypeError: ...
试图删除不可删除的属性时会抛出异常。
TypeError: ...
要求函数的参数名唯一。
SyntaxError: Duplicate parameter name not allowed in this context
禁止八进制数字语法。
SyntaxError: Octal literals are not allowed in strict mode.
禁止设置原始类型值的属性。
TypeError: ...
简化变量的使用
禁用
with
eval
不再为上层范围引入新变量。在严格模式下
eval
仅仅为被运行的代码创建变量。所以eval
不会使得名称映射到外部变量或者其他局部变量。禁止删除声明变量。
delete name
在严格模式下会引起语法错误。SyntaxError: Delete of an unqualified identifier in strict mode.
让eval
和arguments
变的简单
eval
和arguments
不能通过程序语法被绑定赋值。参数的值不会随
arguments
对象的值的改变而变化。不再支持
argument.callee
“安全的”JavaScript
通过
this
传递给一个函数的值不会被强制转换为一个对象。再也不能通过广泛实现的ECMAScript扩展“游走于”JavaScript的栈中。
函数的参数不在提供对相应函数调用变量的访问。
为未来的ECMAScript版本铺平道路
保留了一部分字符作为关键字。比如
implements
,interface
,let
,package
,private
,protected
,public
,static
和yield
禁止了不在脚本或者函数层面上的函数声明
浏览器的严格模式
主流浏览器现在实现了严格模式。但是也有大量浏览器只支持部分严格模式或者根本就不支持,所以不要盲目依赖严格模式。
以上是关于js中的严格模式和非严格模式的比较的主要内容,如果未能解决你的问题,请参考以下文章