资讯专栏INFORMATION COLUMN

javascript - 严格模式

PrototypeZ / 272人阅读

摘要:概述严格模式是什么严格模式是中的一种限制性更强的变种方式。在严格模式下,静默失败会转为报错。抛出错误非严格模式下静默错误属性名必须唯一在严格模式下,一个对象内的所有属性名必须唯一。非严格模式最后一个重名参数会覆盖之前的重名参数。

概述 严格模式是什么

严格模式是JavaScript中的一种限制性更强的变种方式。
严格模式可以和非严格模式共存,所以脚本可以逐渐的选择性加入严格模式。

严格模式的目的

严格模式会将js陷阱直接变成明显的错误

严格模式修正了一些引擎难以优化的错误:同样的代码有些时候在严格模式下更快

严格模式禁用了一些课鞥在未来版本中定义的语法

开启严格模式

在js中想要开启严格模式,需要在代码之前定义一个不会赋给任何变量的固定的字符串
"use strict";或者"use strict";

//全局作用域开启严格模式
"use strict";

//函数作用域开启严格模式
function fun (){
    "use strict"//作用于函数作用域
    //其他代码
}
变量 禁止意外的创建变量

在严格模式下,创建变量必须使用var关键字声明变量

//全局开启严格模式
"use strict";

//创建全局变量,但不使用var关键字
//num = 233;//在非严格模式定义变量可以不使用var关键字,严格模式报错
//console.log(num);//ReferenceError: num is not defined

/*function fun() {
    v = 100;//在函数作用域中定义变量不适用var关键字,自动提升为全局变量
    console.log(v)
}
fun();//ReferenceError: v is not defined*/

function fn() {
    var a = 200;
    console.log(a)
}
fn();//200
静默失败转为异常

所谓静默失败就是既不报错也没有任何效果,例如改变常量的值。在严格模式下,静默失败会转为报错。

"use strict"
const v = 23;//非严格模式下会静默失败
v = 10;//TypeError: Assignment to constant variable.
##禁用delete关键字
在严格模式下,不能对变量使用delete关键字

"use strict"
//定义全局变量
var v = 23;
delete v;//严格模式:SyntaxError: Delete of an unqualified identifier in strict mode.
console.log(v);//非严格模式:undefined
//严格模式下delete关键字只是不能对变量使用

##对变量名的限制
在严格模式中,不能使用保留字作为变量名,会导致语法错误
在非严格模式中可以使用保留字作为变量名

![clipboard.png](/img/bVbfPEs)

"use strict";
var let = 23;//抛出错误:SyntaxError: Unexpected strict mode reserved word

#对象
##不可删除的属性
在严格模式下,不能用delete运算符删除不可删除的属性。

"use strict";
delete Object.portotype;//抛出错误:TypeError: Cannot delete property "prototype" of function Object() { [native code] }
//非严格模式下:静默错误

##属性名必须唯一
在严格模式下,一个对象内的所有属性名必须唯一。

"use strict"
var v {
a = 1,//严格模式下对象内的同名属性编辑器会报错,运行时不报错、输出结果与非严格模式一致
a = 2
};
console.log(v.a)//2

##只读属性的赋值
在严格模式下,不能为一个只读的属性赋值,会报错/非严格模式下,静默失败。

"use strict"
var obj = {

 name : "火锅"

};
//获取属性描述符
console.log(Object.getOwnPropertyDescriptor(obj,"name"));
//给对象obj添加只读属性
Object.defineProperty(obj,"age",{

value:2

});
console.log(Object.getOwnPropertyDescriptor(obj,"age"));

//给只读属性赋值 - 只读属性不能赋值,非严格模式下静默失败
obj.age = 3;//严格模式:TypeError: Cannot assign to read only property "age" of object "#"
console.log(obj.age);

##不可扩展的对象
在严格模式下,不能为不可扩展的对象去添加新属性

"use strict";
//创建一个空对象
var obj = {};
//将对象设置为不可扩展 - 即不能添加新属性
Object.preventExtensions(obj);
//为对象添加新属性 - 非严格模式:静默失败
obj.name = "九筒";//严格模式:TypeError: Cannot add property name, object is not extensible
console.log(obj.name);

#函数
##参数名必须唯一
在严格模式中,要求命名函数的的参数必须唯一。
非严格模式:最后一个重名参数会覆盖之前的重名参数。

"use strict"
function fun (a,a,b){//严格模式:重名参数被认为语法错误
console.log(a+a+b)//抛出错误:SyntaxError: Duplicate parameter name not allowed in this context
}
fun(1,2,3)

##arguments 的不同
- 严格模式:argumengs不受形参影响
- 非严格模式:argumengs与形参有关

function fun (value){

 var value = "火锅";
 console.log(value);//火锅 - 就近原则
 console.log(arguments[0])//严格模式:九筒   非严格模式:火锅 - 就近原则

}
fun("九筒");

##arguments对象的callee()方法
在严格模式中,不能使用arguments对象的callee()方法
非严格模式下使用arguments.callee表示调用函数本身。

"use strict"
function fun (){

return arguments.callee;//抛出TypeError错误

}

##函数声明的限制
在严格模式下,只能在全局作用域和函数作用域中声明函数
非严格模式可以在任意位置声明函数

"use strict"
if(true){
function fun (){}//在块级作用域(非全局和函数作用域)声明函数:语法错误
}
fun()// 抛出错误 ReferenceError: fun is not defined

#增加eval()作用域
在严格模式中,使用eval()函数创建的变量只能在eval()函数内部使用
非严格模式下,eval()函数创建的变量可以在其他位置使用

"use strict"
eval("var v = 23");
console.log(v);//抛出eferenceError: v is not defined

#禁止读写
在严格模式下:禁止使用eval()和arguments作为标识符,也不允许读写他们的值

"use strict";
//以下全部语法错误
var eval = 12
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关键字
抑制this 
- 非严格模式使用apply()和call()方法时,null或undefined值会转换为全局对象
- 严格模式下,函数的this值始终是指定的值(无论是什么值)

"use strict"
var v = 2;
function fun (){
console.log(this.v);
}
var obj ={
v : 3
};
fun.call(null);// TypeError: Cannot read property "v" of null

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

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

相关文章

  • JavaScript面向对象中的严格模式

    摘要:开启严格模式设置对象是一个不可扩展的对象为对象新增属性张无忌在非严格模式下为不可扩展的对象添加新属性,结果是静默失败。 概述 严格模式是什么 严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样,所以不要在未经严格模式特性测试情况下使用严格模式。严格模式可以与非严...

    bang590 评论0 收藏0
  • 那些年,前端学习之路的疑难杂症(一):严格模式与非严格模式

    摘要:反之亦然非严格合并严格看起来是非严格的。在普通的里面给一个拼写错误的变量名赋值会使全局对象新增一个属性并继续工作尽管后面可能出错在现在的中有可能。第三严格模式禁止删除声明变量。 文章整理自MSDN:https://developer.mozilla.org... 1.逐步使用严格模式 ECMAScript 5的严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个...

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

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

    FuisonDesign 评论0 收藏0
  • javascript严格模式

    摘要:概述的严格模式是中的一种限制性更强的变种方式。严格模式在语义上与正常的有一些不同。首先,严格模式会将陷阱直接变成明显的错误。严格模式禁止删除声明变量。 概述 ECMAScript 5的严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样, 所以不要在未经严格模式特...

    Chao 评论0 收藏0
  • 谈谈JavaScript严格模式你应该遵守的那些事

    严格模式 首先来了解一下严格模式是什么?严格模式是JavaScript中的一种限制性更强的变种方式,不是一个子集:它在语义上与正常代码有明显的差异,不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样,所以不要在未经严格模式特性测试情况下使用严格模式,严格模式可以与非严格模式共存,所以脚本可以逐渐的选择性加入严格模式 严格模式的目的 首先,严格模式会将JavaScript陷阱直接变成明显的错...

    MingjunYang 评论0 收藏0

发表评论

0条评论

PrototypeZ

|高级讲师

TA的文章

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