严格模式的简单认识

严格模式

概述

  • 严格模式是什么

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

  • 严格模式的目的

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

开启严格模式

  • 全局开启严格模式

在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错误this

  • 禁用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的下一个版本中可能会用到他们。在严格模式下,使用上述标识符做为变量名会致使语法错误。prototype

对象

  • 不可删除的属性

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

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

  • 属性名必须惟一

在严格模式下,一个对象内的全部属性名在对象内必须惟一。
以下代码是在非严格模式下重名属性是容许的,最后一个属性决定属性值
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);

相关文章
相关标签/搜索