严格模式 "use strict";
通过严格模式,可以在函数内部存在的错误,及时进行较为严格的全局或局部的错误条件检测,可以提前知道代码中存在的错误,及时捕获一些可能导致编程错误的 ECMAScript
行为
<script>
"use strict";
</script>
下面从以下几点说一下严格模式与标准模式的区别
- 变量
- 对象
- 函数
- eval()
- eval与arguments
- 抑制this
- 其他变化
变量
1、不容许意外创建全局变量
"use strict";
message="hello world!";
console.log(message);
2、不能对变量调用delete
操作符
"use strict";
var message="hello world!";
delete message;
//非严格模式
var message="hello world!";
delete message;
console.log(message);
3、对变量名有限制,不能使用yield、let、package等保留字作为变量名
对象
1、为只读属性赋值会抛出错误
2、对不可配置的属性使用delete操作符会抛出错误
3、为不可扩展的对象添加属性会抛出错误
函数
1、命名函数的参数必须唯一
标准模式下:
var b=function (value,value){
console.log(value,value);
}
var c=b(2,3);
console.log(c);
如果两个参数的名字一样的话,标准模式下返回结果为
标准模式下,以第二个参数为准,所以值返回为3,3
,因为b(2,3)
无返回值,所以c
的值为undefined
var m=function (x){
console.log(x);
return x;
}
console.log(m(2));
如果函数中有return
语句,则console.log(m(2));
的值就不会为undefined
了
严格模式下
"use strict";
var b=function (value,value){
console.log(value,value);
}
var c=b(2,3);
console.log(c);
结果会报错
2、修改命名参数的值
"use strict";
var m=function (x){
x=4;
console.log(x,arguments[0]);
}
m(1);//4 1
严格模式下,arguments
的值依然是传入的值,
而标准模式下,则会被改变
3、在if
语句声明函数,函数声明的提升问题
var c = 1;
console.log(a);//undefined
if (c) {
c--;
function a(b) {
return b;
}
}
console.log(a(3));
标准模式下,函数会提升到if
语句外部
严格模式下,会抛出语法错误,它不会提升
4、严格模式下,函数名不可以为interface、let、package
等
5、淘汰了arguments.callee
(引用函数本身)和arguments.caller
(引用调用函数),在严格模式下,引用这两个属性都会抛出错误!
eval()
1、使用eval()
创建变量
(function a(){
eval("var x=90");
console.log(x);//标准模式下90,严格模式下报错
})();
2、可以在eval()
中声明变量和函数,但这些变量或函数只能在被求值得特殊作用域中有效,随后就会被销毁
(function a(){
var c= eval("var x=90,y=40;x*y");
console.log(c);//3600
console.log(x,y);//报错
})();
eval()与arguments
var eval=10;
var arguments=30;
console.log(eval,arguments);//标准模式下,10 30,严格模式下,报错
eval=20;
console.log(eval);//标准模式下,20
非严格模式下,可以重写eval()函数,可以给arguments赋值,
但在严格模式下,将会导致语法错误,不能将他们用作标识符,意味着以下几种使用方式都会抛出错误
- 使用var声明
- 赋予另一个值
- 尝试修改包含的值,如使用++
- 用作函数名
- 用作命名的函数参数
- 在
try-catch
中用作例外名
抑制this
在非严格模式下使用函数的apply()
和call()
方法,null
和undefined
会被替换为全局对象,而在严格模式下,this
值是总是指定的值,无论指定的是什么值
//非严格模式下
var color="red";
var b=function (){
console.log(this);
console.log(this.color);
}
b.call(null);
b.call(undefined);
b();
var c=(function (){
color="blue";
})();
b.call(c);
严格模式下,如果是null或者undefinend,直接报错,函数的this值始终是指定的值,无论指定的是什么值
"use strict";
var color = "red";
var b = function () {
console.log(this.color);
}
var c = {
color :"blue"
}
b.call(c);
b.apply(c);
其它变化
1、去掉了八进制字面量,以0开头的八进制字面量已经成为无效的语法
2、不允许使用with
3、对于八进制字面量,parseInt()的行为有所改变,例如
var e=010;
var d=parseInt(e);
console.log(d);//10