综述:"use strict"来设置严格模式,目的是消除js的不严谨之处,减少怪异行为,确保安全,提高编译效率,为未来的js做好铺垫
1.什么是严格模式和普通模式?
通过在整个js文件或者function前部添加"use strict",使js解析器在执行js或者函数的时候,使用比普通模式下更加严格的语法,这就叫做严格模式;
2.为什么要区分这两种模式?区分有什么好处?
严格模式是一种将更好的错误检查引入代码中的方法。 在使用严格模式时,无法使用隐式声明的变量、将值赋给只读属性或将属性添加到不可扩展的对象等 ,严格模式的目的
-
消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为
-
消除代码运行的一些不安全之处,保证代码运行的安全
-
提高编译器效率,增加运行速度
-
为未来新版本的Javascript做好铺垫
3. 两者之间的区别?
严格模式 | 非严格模式 |
---|---|
禁止使用with语句 | 允许使用with语句 |
所有变量要先声明 | 使用未声明的变量将隐式声明为全局变量 |
函数(非方法)中的this 是undefined | this 是全局对象 |
call() 和apply() 传入的第一个值不会被转换 | call() 和apply() 传入的第一个值如果是null 和undefined ,则会被全局对象取代,如果是原始值则转换为对应的包装对象 |
给只读属性和不可扩展的对象创建新成员将抛出类型错误异常 | 只是简单的操作失败 |
传入eval() 的代码不能在定义变量和函数 | 变量和函数定义在eval() 创建的新作用域中 |
函数中的arguments 对象拥有传入函数值的静态副本 | |
delete 后跟非法标识符将抛出语法错误异常 | 只是简单的返回false |
delete 删除不可配置的属性将抛出类型错误异常 | 只是简单的返回false |
在对象直接量中定义多个同名属性将产生语法错误 | 不会报错 |
函数声明存在多个同名的参数将产生语法错误 | 不会报错 |
不允许使用八进制直接量 | 某些实现是允许的 |
eval 和arguments 当作关键字,并且不允许更改 | |
限制了对栈的检测能力,arguments.caller 和arguments.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...
}
注:文章中引用了他人的博客内容,感谢