Javascript的严格模式strict mode详细介绍
“严格模式”(strictmode)是ECMA-262Edition5定义的新语法,表示要用严格的Javascript语法来执行,有一些过去惯用的写法就会抛出SyntaxError异常,例如:
1.变量前没有用var宣告
2.使用八进制语法:varn=023和vars="\047"
3.使用with语句
4.使用delete删除一个变量名(而不是属性名):deletemyVariable
5.使用eval或arguments作为变量名或函数名
6.使用未来保留字(也许会在ECMAScript6中使用):implements,interface,let,package,private,protected,public,static,和yield作为变量名或函数名
7.在语句块中使用函数声明:if(a<b){functionf(){}}
8.其他错误
8.1.对象子面量中使用两个相同的属性名:{a:1,b:3,a:7}
8.2.函数形参中使用两个相同的参数名:functionf(a,b,b){}
这些下面具体说明。
一、为什么使用”严格模式”(strictmode)
设立”严格模式”的目的,主要有以下几个:
1.消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
2.消除代码运行的一些不安全之处,保证代码运行的安全;
3.提高编译器效率,增加运行速度;
4.为未来新版本的Javascript做好铺垫。
“严格模式”体现了Javascript更合理、更安全、更严谨的发展方向,包括IE10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。
另一方面,同样的代码,在”严格模式”中,可能会有不一样的运行结果;一些在”正常模式”下可以运行的语句,在”严格模式”下将不能运行。掌握这些内容,有助于更细致深入地理解Javascript,让你变成一个更好的程序员。
本文将对”严格模式”做详细介绍。
二、宣告”严格模式”(strictmode)
宣告”严格模式”(strictmode)很简单只有一条语句:
"usestrict";
注:老版本的浏览器会把它当作一行普通字符串,加以忽略。
三、宣告”严格模式”(strictmode)的位置及上下文关系
“严格模式”(strictmode)主要是影响他所在的scope,如果在函数中使用,并不会让globalscope以及其他未使用的函数变成”严格模式”(strictmode)。也就是说严格模式声明的范围取决于其上下文。如果在全局上下文(函数的范围之外)中声明严格模式,则程序中的所有代码都处于严格模式。如果在函数中声明严格模式,则函数中的所有代码都处于严格模式。例如,在下面的示例中,所有代码都处于严格模式,并且函数外部的变量声明会导致出现语法错误:“严格模式下未定义变量”。”严格模式”有两种调用方法,适用于不同的场合。
1.针对整个脚本文件
将”usestrict”放在脚本文件的第一行,则整个脚本都将以”严格模式”运行。如果这行语句不在第一行,则无效,整个脚本以”正常模式”运行。如果不同模式的代码文件合并成一个文件,这一点需要特别注意。
(严格地说,只要前面不是产生实际运行结果的语句,”usestrict”可以不在第一行,比如直接跟在一个空的分号后面。)
<script> "usestrict"; console.log("这是严格模式。"); </script>
<script> console.log("这是正常模式。"); </script>