严格模式和普通模式之间的区别

综述:"use strict"来设置严格模式,目的是消除js的不严谨之处,减少怪异行为,确保安全,提高编译效率,为未来的js做好铺垫

1.什么是严格模式和普通模式?

通过在整个js文件或者function前部添加"use strict",使js解析器在执行js或者函数的时候,使用比普通模式下更加严格的语法,这就叫做严格模式;

2.为什么要区分这两种模式?区分有什么好处?

严格模式是一种将更好的错误检查引入代码中的方法。 在使用严格模式时,无法使用隐式声明的变量、将值赋给只读属性或将属性添加到不可扩展的对象等 ,严格模式的目的

  • 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为  

  • 消除代码运行的一些不安全之处,保证代码运行的安全  

  •  提高编译器效率,增加运行速度  

  •  为未来新版本的Javascript做好铺垫

3. 两者之间的区别?

严格模式 非严格模式
禁止使用with语句 允许使用with语句
所有变量要先声明 使用未声明的变量将隐式声明为全局变量
函数(非方法)中的thisundefined this是全局对象
call()apply()传入的第一个值不会被转换 call()apply()传入的第一个值如果是nullundefined,则会被全局对象取代,如果是原始值则转换为对应的包装对象
给只读属性和不可扩展的对象创建新成员将抛出类型错误异常 只是简单的操作失败
传入eval()的代码不能在定义变量和函数 变量和函数定义在eval()创建的新作用域中
函数中的arguments对象拥有传入函数值的静态副本  
delete后跟非法标识符将抛出语法错误异常 只是简单的返回false
delete删除不可配置的属性将抛出类型错误异常 只是简单的返回false
在对象直接量中定义多个同名属性将产生语法错误 不会报错
函数声明存在多个同名的参数将产生语法错误 不会报错
不允许使用八进制直接量 某些实现是允许的
evalarguments当作关键字,并且不允许更改  
限制了对栈的检测能力,arguments.callerarguments.callee将抛出类型错误异常  

4.怎样来设置严格模式和普通模式?

声明严格模式 可以通过在文件、程序或函数的开头添加 "use strict"; 来声明严格模式。 此类声明称作“指令序言”。 严格模式声明的范围取决于其上下文。 如果在全局上下文(函数的范围之外)中声明严格模式,则程序中的所有代码都处于严格模式。如果在函数中声明严格模式,则函数中的所有代码都处于严格模式,如下所示:

//test.js
'use strict'; //整个js文件都是严格模式下执行的
 var n = 1;
 var foo = function(){...};
//...
var n = 1;
var foo = function(){
    'use strict';
    //在foo函数内是严格模式
    //some code...
}

注:文章中引用了他人的博客内容,感谢

猜你喜欢

转载自blog.csdn.net/m0_37631322/article/details/81772058