您的位置:首页 > Web前端 > JavaScript

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

2016-07-28 01:11 375 查看
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被禁用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息