'strict mode" IE10+可以支持
如何进入严格模式
----------------------------------------------------------------------------------------------------------------------------------------------------------
使用严格模式编译指示 “use strict"
两种声明方式
1.放在脚本第一行(否则不起效),则整个脚本文件都按照严格模式运行
但是这样要注意合并脚本的问题,因为在全局开启严格模式,所以此时如果合并脚本,或者引进其他脚本,则其他脚本也会处于严格模式,如果其他脚本原来是非严格模式,且里面某些代码书写不规范,可能就会造成报错
所以如果要在某个脚本中使用严格模式,一个解决方法是把所有代码放在一个自执行的匿名函数中,在该匿名函数中声明严格模式(其实就是下面第二种方式)
2.针对某个函数进行严格模式(声明在函数体中也应该放在第一行)
var a = function ( ) {
“use strict"
//...
}
严格模式与非严格模式的区别
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.无法再意外创建全局变量,.给没有通过var声明的变量赋值,会报错
比如x =1,在非严格模式下会创建一个全局变量,并不会报错
但是严格模式下,执行以下代码会报错
x=1;alert(x);//报错
for(i =0;i<10;i++){
//some code..
}
// 报错
2.会使引起静默失败(不报错也没有任何效果)的赋值操作抛出异常
比如:
(1)对于一个对象的只读属性赋值
var o={ };o.defineProperty(o,'a',{value:1,writable:false});
(2)对禁止扩展的对象添加新属性
var o={'x':100}; Object.preventExtensions(o);o.y=200;console.log(o);//报错
(3)试图删除不可删除的属性
var x =1;delete x;//报错
还有其他的等等..
3.禁止使用with
var obj= { };obj.a=1;obj.b=2;
with(obj){
alert(a+b)
}//报错
4.普通模式下只有全局和函数作用域,而在严格模式下会有第三种作用域:
eval作用域,eval语句的作用域,取决于它处于全局作用域还是函数作用域,严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量,它生成的变量只能用于eval内部
普通模式下:
eval('var a=2;'); alert(a);//2 相当于 var a= 2;alert(a);
var abc =function( ){
eval('var a=2');
alert(a);//2
}
abc( );
alert(a);//报错
严格模式下:
eval('var a=2;alert(a);'); //2
alert(a);报错
这个a变量只属于eval这个作用域
5.为了让代码更安全,禁止this指向全局对象
普通模式:
function a( ){
console.log(this);//window
}
a( );//window
严格模式
function a( ) {
console.log(this);
}
a( );//undefined
所以,在严格模式下,如果构造函数没有使用new实例化对象,那么就会报错,因为undefined无法设置属性
var Cat = funciton (name) {
this.name = name;
this.sayName = function ( ) {
alert(this.name)
}
}
普通模式下直接调用 Cat('dora'); 这时候相当于给window直接设置属性name和sayName
console.log(window)此时直接查看window,可以在控制台中看到window下面有name和sayName两个属性
window.say( )//dora
但是在严格模式下就会报错,因为给undefined设置属性本来就是不行的
6.为了让代码更安全,禁止在函数内部遍历调用栈callee,caller,argumets这些属性使用不了
7.使用对象字面量时,属性名必须唯一,函数的参数名也必须唯一
非严格模式下,如果函数参数名字有相同,那么后面的参数名会覆盖前面的,只能访问最后一个同名的参数,但是被覆盖的仍可以通过arguments来获得,但是这在严格模式下是会导致错误的
8.禁止八进制表示法,普通模式下,整数的第一位如果是0,表示这是八进制数,严格模式下禁止这种表示法,整数第一位是0,将会报错
12.arguments对象的限制
(1)不允许对arguments赋值
(2)arguments不再追踪参数的变化
( 3 ) 禁止使用arguments.callee这意味着,我们无法在匿名函数内部调用自身
var fn = function(num) {
num +=100;
alert(arguments[0]);//普通200,严格100
}
fn(100);
因为js的函数形参是没硬性规定的,即使没有定义形参,也可以通过arguments来随便获得传进来的参数,所以在正常模式下虽然可行,但是是不规范的,严格模式就对此作了规范
13.函数必须声明在顶层,将来javascript的新版本会引进块级作用域,为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数,换句话说,不允许在非函数的代码块内声明函数,但是在自执行的匿名函数中是没有问题的
var a= 6;
if(a>2){
function fn ( ) {
alert('hi');
}
fn( );
}
//报错
14.为了向新版本过渡,禁止使用保留关键字