【慕课学习】《JavaScript深入浅出》——严格模式

js的严格模式是一种特殊的执行模式,它修复了部分语言上的不足,提供更强的错误检查,并增强安全性。
进入严格模式:

//在函数开头加上‘use strict’指令
function func(){
    'use strict';
    //code
}
//或在整个js文件最开头加上‘use strict’指令,使整个js都使用严格模式
'use strict';
function func(){
    //code
}
//注:如果浏览器不支持严格模式,‘use strict’指令会被当作普通字符串而被忽略
//实际上'use strict'之前也可以添加其他指令,但必须写在正式的js代码之前

严格模式和普通模式的区别在于:

1、严格模式不允许使用with语句

!function(){
    with({x:1}){
        console.log(x);
    }
}()
//1

!function(){
    'use strict';
    with({x:1}){
        console.log(x);
    }
}()
//SyntaxError

2、不允许未声明的变量被赋值

!function(){
    x=1;
    console.log(window.x);
}()
//1

!function(){
    'use strict';
    x=1;
    console.log(window.x);
}()
//ReferenceError

3、arguments参数的静态副本

!function(a){
    arguments[0]=100;
    console.log(a);
}(1)
//100
//注:若传的参数不是1,而是不传,那么结果为undefined,不会受arguments影响

!function(a){
    'use strict';
    arguments[0]=100;
    console.log(a);
}(1)
//1
//注:arguments变为静态副本,与形参a没有绑定关系,不会与a相互影响

!function(a){
    'use strict';
    arguments[0].x=100;
    console.log(a.x);
}({x:1})
//100
//注:若参数为对象,修改对象的属性,arguments与形参a还是会相互影响

4、delete参数、函数名报错

!function(a){
    console.log(delete a);
}(1)
//false

!function(a){
    'use strict';
    console.log(delete a);
}(1)
//SyntaxError

5、delete不可配置的属性报错

!function(a){
     var obj={};
     Object.defineProperty(obj,'a',{configurable:false});
    console.log(delete obj.a);
}(1)
//false

!function(a){
    'use strict';
    var obj={};
    Object.defineProperty(obj,'a',{configurable:false});
    console.log(delete obj.a);
}(1)
//TypeError

6、对象字面量重复属性报错

!function(){
    var obj={x:1,x:2};
    console.log(obj.x);
}()
//2

!function(){
    'use strict';
    var obj={x:1,x:2};
    console.log(obj.x);
}()
//SyntaxError

7、禁止八进制字面量

!function(){
    console.log(0123);
}()

!function(){
    'use strict';
    console.log(0123);
}()
//SyntaxError

8、eval、arguments变为关键字,不能作为变量、函数名

!function(){
    function eval(){};
    console.log(eval);
}()
//function eval(){}

!function(){
    'use strict';
    function eval(){};
}()
//SyntaxError

9、eval变成独立作用域

!function(){
    eval('var val=3;');
    console.log(typeof val);
}()
//number

!function(){
    'use strict';
    eval('var val=3;');
    console.log(typeof val);
}()
//undefined,在eval外不能拿到eval内声明的变量

10、其他

严格模式下,一般函数调用时(不是对象的方法调用,也不适用apply/call/bind等修改this)this指向null,而不是全局对象。
若使用apply/call,当传入null或undefined时,this将指向null或undefined,而不是全局对象。
arguments.cller,arguments.callee被禁用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值