严格模式的简单认识

逆秩协程
• 阅读 1318

严格模式

概述

  • 严格模式是什么

严格模式是JavaScript中的一种限制性更强的变种模式。严格模式不是一个子集:它的语义上与正常代码有着明显的差异。
不支持严格模式的浏览器与严格模式的浏览器行为也不一样,所以不要在未经严格模式特性测试情况下使用严格模式。
严格模式可以与非严格模式共存,所以脚本可以逐渐的选择性加入严格模式。

  • 严格模式的目的

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

开启严格模式

  • 全局开启严格模式

在JavaScript中想要开启严格模式,需要在所有代码之前,定义一个不会赋给任何变量的字符串:
'use strict';//或者‘use strict’ ;
如果之前的JavaScript代码是非严格模式的话,建议不要盲目为这段代码开启严格模式,这样可能会出现问题。建议按一个个函数去开启严格模式。

  • 函数开启严格模式

也可以为某个指定的函数开启严格模式,如下代码示例:
//函数外依旧是非严格模式
function doSomething(){
‘user strict’};开启严格模式
//其他代码
}
在匿名函数中使用严格模式,相当于在全局开启严格模式的变通实现方式。
(function(){
'use strict'};//开启严格模式
})();

变量

  • 禁止意外创建严格变量

在严格模式下,不允许意外创建全局变量。
如下代码是非严格模式下意外创建的全局变量。
//message='this is message';
如下代码是严格模式下意外创建全局变量。
'use strict';//开启严格模式
//严格模式下,意外创建全局变量,抛出ReferenceError
message = 'this is message';

  • 静默失败转为异常

所谓静默失败就是既不报错也没有任何效果,例如改变常量的值。在严格模式下,静默失败会转换成抛出异常。
如下代码是非严格模式下的静默失败。
const PI= 3.14;
PI =1.14;//静默失败
console.log (PI);//3.14
如下代码是严格模式下的静默失败。
'use strict';//开启严格模式
const PI=3.14;
PI=1.14;//抛出Type Error错误

  • 禁用delete 关键字

在严格模式下,不能对变量使用delete运算符。
如下代码是非严格模式下使用delete运算符,结果会静默失败。
var =color = 'red';
delete color ;
如下代码是严格模式下使用delete运算符,结果会抛出异常。
'use strict';//开启严格模式
var =color ='red';
delete color ;//抛出ReferenceError错误
对变量名的限制
在严格模式下,JavaScript对变量名也是有限制。特别不能使用如下内容作为变量名:
implements,interface ,let ,package,private ,protected ,public , static,
yield。
上述内容都是保留字 在ECMAScript的下一个版本中可能会用到他们。在严格模式下,使用上述标识符作为变量名会导致语法错误。

对象

  • 不可删除的属性

在严格模式下,不能使用delete运算符删除不可删除的属性。
如下代码是严格模式下使用delete运算符删除不可删除的属性,结果会静默失败。
delete Objcet.prototype;
如下代码是严格模式下使用delete元素安抚删除不可删除的属性,结果会抛出异常。
'use strict';//开启严格模式

delete Object.prototype;//抛出TypeError错误

  • 属性名必须唯一

在严格模式下,一个对象内的所有属性名在对象内必须唯一。
如下代码是在非严格模式下重名属性是允许的,最后一个属性决定属性值
var 0 ={ p:1 ,p:2};
如下代码是严格模式下重命属性被认为是错误语法。
'use strict ';开启严格模式。
var 0= {p:1,p:2};//报错

  • 只读属性赋值 在严格模式下,不能为一个只读属性进行重新赋值

如下代码是在开启严格模式下为只读属性重新赋值,结果会抛出异常 。
'use strict';开启严格模式
var obj1={};
Object.defoneProperty(OBJ1,‘x’),{value 42,writable:false});obj1.x=9;//将属性设置为只读

  • 不可扩展的对象

在严格模式下不能为不可扩展的对象添加新属性。
'use strict';开启严格模式
var obj={}
Object.preventExtensions(obj);//将对象变得不可扩展
obj.newprop ='ohai';//抛出typeError错误
结果会出现异常

函数

  • 参数名必须唯一

在严格模式下,要求命名函数的参数必须唯一。
function sum(a,a,b){
//语法错误
'use strict';
return a+a+c;//代码运行到这里会报错
}

  • arguments的不同

在严格模式下,arguments对象的行为也有所不用。
严格模式下,修改命名参数的值也会反应到argument对象中。
严格模式下,命名参数与arguments对象是完全独立的。
function showValue(value){
value ='foo';
console.log(value);//foo
console.log(arguments[0]);//在严格模式下foo
//在非严格模式下hello
}
showValue ('hello');
arguments.callee()
在严格模式下,不能使用arugments 对象的callee()方法。
在严格模式下使用arguments对象的callee()方法,结果会抛出异常。
'use strict';//开启严格模式
var f =function(){
return arguments.callee;};
f();//抛出TypeError错误
函数声明的限制
在严格模式下,只能在全局和函数域中声明函数
如下代码是严格模式下在出全局域和函数域中声明函数是错误语法
'use strict';//开启严格模式
if(true){
function f(){}//错误语法
}

eval(函数)

  • 增加eval作用域

在严格模式下,使用eval()函数创建的变量只能在eval()函数内部使用。
如下代码是严格下eval()函数创建的变量只能在eval()函数内部使用
'use strict';开启严格模式
eval('var x =412');
console.log(x);//抛出RefeienceError错误

arguments对象

  • 禁止读写

在严格模式下,以下的所有尝试导致语法错误:
'use strict';开启严格模式
eval=17 ;
arguments++;
++eval;
var obj ={set p (arguments){}};
var eval;
try {}catch(arguments){}
function x(eval){}
function arguments(){}
var y =function eval(){}
var f =new Function('arguments','use strict','return 17');

this 关键字

  • 抑制关键字

在严格模式下使用函数的apply()call()方法是,NULL或undefind值会被转换为全局对象。
在严格模式下,函数的this值始终是指定的值。
var color ='red';
function sayColor(){
console.log(this.color)}//非严格模式下red
//严格模式下 抛出错误
}
say Color.call(null);

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章带你了解JavaScript this关键字
与其他语言相比,this关键字在JavaScript中的行为略有不同。JavaScript中,this关键字引用其所属的对象。根据使用位置,它具有不同的值。一、前言方法中,this关键字引用其所属的对象。1.this指的是全局对象在函数中。2.this引用全局对象在函数中。3.在严格模式下,this是未定义的在事件中。4.
小嫌 小嫌
3年前
bind()与call()和apply()之间的区别
具体内容以及示例可参见网站:需要记住的基本规则1."this"指代一个对象2."this"指的是调用它包含的函数的对象。3.在全局上下文中,“this”指的是窗口对象,或者如果使用“严格模式”则是未定义的。varcarregistrationNumber:"GA12345",brand:"Toyota",dis
LinMeng LinMeng
4年前
html5的input类型(type)和所有属性详解
先总结input的所有属性required:标记一个字段是否为必须。如果一个字段被标记为required"required"(严格模式下),或者required(宽松模式下)并且这个字段的值为空,或者填入的值是无效值,那么这个表单不能提交。什么是无效值?看pattern属性pattern:该属性包含了一个JavaScript风格的正则表达式,输
LinMeng LinMeng
4年前
js之传值与传址/undefined和null/严格模式
传值与传址基本数据类型有五种Undefined、Null、Boolean、Number和String引用数据类型有两种object,array,fn两种数据类型的区别:1.存储位置不同原始数据类型直接存储在栈(stack)中简单数据段,占据空间小,大小固定,属于被频繁使用的数据,所以存储在栈中;引用数据类型直接存
Stella981 Stella981
3年前
Apache commons chain 初探
Apachecommonschain是什么Apachecommonchain是对责任链设计模式的改造封装,让使用者更加方便的使用。简单回顾一下责任链设计模式在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(ChainofResponsibility)模式的:责任链模式是一种对象的行为模式。在
Wesley13 Wesley13
3年前
ES6模块化与常用功能
目前开发环境已经普及使用,如vue,react等,但浏览器环境却支持不好,所以需要开发环境编译,下面介绍下开发环境的使用和常用语法:一,ES6模块化1,模块化的基本语法ES6的模块自动采用严格模式,不管你有没有在模块头部加上"usestrict";。模块功能主要由两个命令构成:export和import(注意有无defaul
Stella981 Stella981
3年前
70行lua代码实现一个满足基本要求的模版引擎
以下内容仅供学习交流,未经严格考虑与测试,切勿用于生产环境。ltemplate.lualocalinserttable.insertlocalremovetable.removelocalconcattable.concatlocalformatstring.format
Wesley13 Wesley13
3年前
ES6模块化注意点
ES6的模块自动采用严格模式,不管你有没有在模块头部加上"usestrict";。严格模式主要有以下限制。变量必须声明后再使用函数的参数不能有同名属性,否则报错不能使用with语句不能对只读属性赋值,否则报错不能使用前缀0表示八进制数,否则报错不能删除不可删除的属性,否则报错
Stella981 Stella981
3年前
ES6中箭头函数与普通函数this的区别(转)
看到一篇别人的博客,对this的理解又加深了一些。普通函数中的this:1\.this总是代表它的直接调用者,例如obj.func,那么func中的this就是obj2.在默认情况(非严格模式下,未使用'usestrict'),没找到直接调用者,则this指的是window3.在严格模式下,没有直接调用者的函数中的thi
Stella981 Stella981
3年前
JavaScript基础入门05
\toc\JavaScript基础入门05严格模式运行js代码的过程中,除了正常的代码运行模式以外,还存在严格模式(strictmode)。意义在于让代码采用更加严格的JavaScript语法。需要注意的是,相同的代码,在不同的模式下可能会有不同的结果。很多时候在正常模式下能够运行
Wesley13 Wesley13
3年前
#分布式系统架构之# 事件驱动模式以及与之匹配的长时间处理过程讨论
     在分布式系统下,可以很多种架构从事设计,或者分布式系统对技术架构本身没有做严格的限制。但是结合自己的实践以及基于《领域驱动设计》的推荐,采用【事件驱动模式】是比较好的一种分布式系统架构方式。该模式充分实现了不同系统之间的代码解耦,所有的业务流转是通过事件广播进行驱动的。所有业务都是在针对名为【事件总线】的组件在编程,也无需知道事件的生产者