1、什么是JavaScript 严格模式?
JavaScript 严格模式(strict mode)即在严格的条件下运行。
同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。
支持严格模式的浏览器:
Internet Explorer 10 +、 Firefox 4+ Chrome 13+、 Safari 5.1+、 Opera 12+。
2、为什么使用严格模式?
消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。
3、严格模式声明
严格模式通过在脚本或函数的头部添加 “use strict”; 表达式来声明(它不是一条语句,但是是一个字面量表达式,在 JavaScript 旧版本中会被忽略)。
在函数内部声明是局部作用域 (只在函数内使用严格模式)。
4、严格模式的限制
不允许使用未声明的变量;
不允许删除变量或对象(delete);
不允许删除函数(delete);
不允许函数形参重名;
"use strict";
function x(p1, p1) {}; // 报错
不允许适应八进制;
"use strict";
var x = 010; // 报错
不允许使用转义字符;
"use strict";
var x = \010; // 报错
不允许对只读属性赋值;
(非严格模式下只是赋值无效,但不会报错;严格模式下会报错)
"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // 报错
不允许对一个使用getter()
方法读取的属性进行赋值;
"use strict";
var o={
get x(){
return 1;
}
};
o.x=10; //报错
console.log(o.x);
不允许删除一个不允许删除的属性;
"use strict";
delete Object.prototype; //报错
变量名不能使用“eval”、“arguments”字符串;
由于一些安全原因,在作用域 eval() 创建的变量不能被调用;
"use strict";
eval ("var x = 2");
alert (x); // 报错
禁止this关键字指向全局对象;
function f2(){
"use strict";
console.log(this); //undefined
}
f2();
因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。
function f(){
"use strict";
this.a = 1;
};
f(); // 报错,this未定义
5、get set 访问器
var obj={
name:"",
get getname(){
//获取属性值
return this.name;
},
set setname(n){
//设置属性值
this.name=n;
}
};
//设置值
obj.setname="小花";
console.log(obj.getname);