es6严格模式

es6严格模式

在js代码最上方写**“use strict”;**
开启严格模式,当使用ES6模块化开发时,严格模式不需要写,自动启用

es6严格模式的要求
1-------变量必须声明后再使用

如果不使用varletconst定义变量和常量就不能直接使用
		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 接口,类得接口
发布了8 篇原创文章 · 获赞 0 · 访问量 139

猜你喜欢

转载自blog.csdn.net/weixin_44157964/article/details/103929857