es6严格模式
在js代码最上方写**“use strict”;**
开启严格模式,当使用ES6模块化开发时,严格模式不需要写,自动启用
es6严格模式的要求
1-------变量必须声明后再使用
如果不使用var、let、const定义变量和常量就不能直接使用
x=3;
y=4;
console.log(x+y);//报错
2------ 函数的参数不能有同名属性,否则报错
不允许出现函数中参数名相同
function fn(a,a){
}
n(3,4);//报错
3-------不能使用with语句,with的效率低下
var div=document.createElement("div");
// div.style.width="50px";
// div.style.height="50px";
// div.style.backgroundColor="red";
with(div.style){
width="50px";
height="50px";
backgroundColor="red";
}
document.body.appendChild(div);
4----- 不能对只读属性赋值,否则报错
1----------像字符串中的length 就是只读属性,不能修改,否则会报错
var str="aaaa";
str.length=10; //报错
2---------除了一些默认的只读属性,还可以把属性变为只读属性,比如把对象冻结,冻结的属性也是只读属性,不能修改
var obj={
a:1,
b:2
};
Object.freeze(obj);//使用freeze可以冻结冻结,不可修改其属性
obj.a=10;//报错
3-----------还有一种方法可以定义只读属性,定义的只读属性不可以修改
var obj={};
Object.defineProperty(obj,"a",{
writable:false,//writable 是否可写
value:10
})
obj.a=20;//报错
4-----------对象中只有get方法,没有set方法,因此也是只读属性
var obj={
get a(){
return 5;
}
}
obj.a=10;//报错
5-------不能使用前缀 0 表示八进制数,否则报错
var a=067//报错
6-------不能删除不可删除的属性,否则报错
1--------不课删除属性不能被删除
var arr=[1,2,3];
delete arr.length;//报错
2--------不能删除不可配置属性
var obj={};
Object.defineProperty(obj,"a",{
configurable:false,//不可配置
value:10
});
delete obj.a;//报错
3--------冻结属性不能被删除
var obj={
a:1,
b:2
};
Object.freeze(obj);
delete obj.a; //报错
7------不能删除变量delete prop,会报错,只能删除属性delete global[prop]
这个暂时不会,用不到
8-----不要用eval(最好禁止使用),影响性能,除非实在解决不了的问题再考虑这个方法
这里先说一下eval达到的效果,虽然用起来很好用,但是很影响性能,它的原理是对每一个字符串匹配,从第一个开始,不符合然后再查找第二个,这样很浪费性能
(1)-------可以直接获取到事件对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
div{width: 50px;height: 50px;background-color: red;border: 1px solid #000000;}
</style>
</head>
<body>
<div id="div0"></div>
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
<div id="div4"></div>
<script>
for(var i=0;i<5;i++){
eval("div"+i).addEventListener("click",clickHandler);//可直接获取点击事件的对象
}
function clickHandler(e){
console.log(this);//这里的this指每一个div,打印每一个div
}
</script>
</body>
<html>
2-----------可以直接获取每一个对象的属性
var obj1={
a:1,b:2
}
var obj2={
a:3,b:4
}
var obj3={
a:5,b:6
}
for(var i=1;i<4;i++){
eval("obj"+i).a+=10;
}
console.log(obj1,obj2,obj3);//{a: 11, b: 2} {a: 13, b: 4} {a: 15, b: 6}
3----------可以直接进行计算
console.log(eval("3+5"));//8
var num1=3;
var num2=5;
var type="*";
console.log(eval(num1+type+num2))//15
function getSum(a,b){
console.log(a+b)
}
eval("getSum(5,8)");//13
9--------eval和arguments不能被重新赋值
eval="a";//报错
arguments=10;//报错
10--------不能使用arguments.callee arguments.callee.caller(不让定义匿名函数)
function fn(){
// arguments.callee;//不能使用,不要使用匿名函数就可以解决
// arguments.callee.caller;//不能使用 需要环境函数时,通过传参回调函数
}
11---------禁止this指向全局对象;顶层的this指向undefined,即不应该在顶层代码使用this。
12---------不能使用fn.caller和fn.arguments获取函数调用的堆栈
13--------- 增加了保留字(比如protected、static和interface)
// protected 受保护函数或者属性
// static 静态
// interface 接口,类得接口