javascript 严格模式

'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.为了向新版本过渡,禁止使用保留关键字

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值