摘要:不支持严格模式的浏览器与严格模式的浏览器行为也不一样,所以不要在未经严格模式特性测试情况下使用严格模式。在严格模式下,使用上述标识符作为变量名会导致语法错误。严格模式下,命名参数与对象是完全独立的。在严格模式下,函数的值始终是指定的值。
严格模式 概述
严格模式是什么
严格模式是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()函数内部使用
"use strict";开启严格模式
eval("var x =412");
console.log(x);//抛出RefeienceError错误
禁止读写
在严格模式下,以下的所有尝试导致语法错误:
"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");
抑制关键字
在严格模式下使用函数的apply()call()方法是,NULL或undefind值会被转换为全局对象。
在严格模式下,函数的this值始终是指定的值。
var color ="red";
function sayColor(){
console.log(this.color)}//非严格模式下red
//严格模式下 抛出错误
}
say Color.call(null);
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/97075.html
摘要:使用表明你的比较不会涉及任何的隐形的类型转换。当对不同类型的数据进行比较的时候你要首先把它们进行显示的类型转换。然后再进行比较这样会使你的程序更加清晰。 1、JavaScript 严格模式 通过在程序最开始假如一个字符串字面量 use strict ,即可开启严格模式 严格模式可以让JS代码拥有更好的兼容性,更强的健壮性 在严格模式下,重新声明 arguments 会报错,非严格模式...
摘要:箭头函数的寻值行为与普通变量相同,在作用域中逐级寻找。题目这次通过构造函数来创建一个对象,并执行相同的个方法。 我们知道this绑定规则一共有5种情况: 1、默认绑定(严格/非严格模式) 2、隐式绑定 3、显式绑定 4、new绑定 5、箭头函数绑定 其实大部分情况下可以用一句话来概括,this总是指向调用该函数的对象。 但是对于箭头函数并不是这样,是根据外层(函数或者全局)作用域(...
摘要:之前写过两篇面试官问能否模拟实现的操作符和面试官问能否模拟实现的方法其中模拟方法时是使用的和修改指向。但面试官可能问能否不用和来实现呢。使用模拟实现的浏览器环境非严格模式方法的属性是。 之前写过两篇《面试官问:能否模拟实现JS的new操作符》和《面试官问:能否模拟实现JS的bind方法》 其中模拟bind方法时是使用的call和apply修改this指向。但面试官可能问:能否不用cal...
摘要:首发个人博客中的,大家都用过。箭头函数,词法作用域中的简单的说,箭头函数中的,会绑定到函数外也就是上一层作用域中的,函数外的指向哪,箭头函数中的就指向哪。 首发个人博客 JavaScript 中的 this ,大家都用过。但是它到底指向哪里呢?今天在阅读 《你不知道的JavaScript (上卷)》再结合自己平时看的博客,对它又有了新的认识,在此来做个小结,再碰到 this ,就再也不...
摘要:关于中的指向我上的菜鸟仓库地址点击跳转查看其他相关文章文章在我的博客上的地址点击跳转学习,必不可少的肯定要理解的指向。 关于javascript中this的指向 我GitHub上的菜鸟仓库地址: 点击跳转查看其他相关文章 文章在我的博客上的地址: 点击跳转 学习javascript,必不可少的肯定要理解this的指向。要学习this指向之前,就要先理解了我前面写的几...
阅读 2322·2021-09-29 09:42
阅读 558·2021-09-06 15:02
阅读 2598·2021-09-02 15:40
阅读 2114·2019-08-30 14:23
阅读 1862·2019-08-30 13:48
阅读 1290·2019-08-26 12:01
阅读 959·2019-08-26 11:53
阅读 2142·2019-08-23 18:31