变量
var 缺点:可以重复修改变量的值,不限制修改变量的值,没有块作用域
解决办法:用let取代var 常量用const表示
箭头函数
function(){}
()=>{}
只有一个参数括号可以省略;
如果只有一个return,大括号和return都可以省略;
没有参数,不能省略
优点:简洁明了;可以利用this改变上下文对象,在箭头函数中始终当前这一个函数
let show=function(a,b){
return (a+b);
}
show();
let show=(a,b)=>a+b;
show();
解构赋值
对多个变量同时赋值
注意:1.左右两边结构必须一样,
let [{a,b},num,[c,d,[e,f]],str]=[{a:1,b:2},3,[4,5,[6,7]],"很健康"];
document.write(a,b,num,c,d,e,f,str);
//如果解构不成功,变量的值就等于undefined
let [h,j,g]=[137,289];
console.log(h,j,g);//g为undefined
//不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组
let [x,y]=[1,2,3];
console.log(x,y);
2.右边必须是个东西
let {a,b}={1,2}//报错
let {a,b}={a:1,b:2}//正确
3.声明和赋值不能分开,必须在一句话当中
let {a,b};{a:1,b:2};//报错
let {a,b}={a:1,b:2}//正确
单击按钮一直会出现满足条件的最后一个数的原因
也就是onclick那个匿名函数是在for循环执行完成后(用户单击链接时)才被调用的。
而调用时,需要对变量i求值,解析程序首先会在事件处理程序内部查找,但i没有定义。
然后,又到方法外部去查找,此时有定义,但i的值是3(只有i大于3才会停止执行for循环)。
因此,就会取得该值——这正是闭包(匿名函数)要使用其外部作用域中变量的结果。
而且,这也是由于匿名函数本身无法传递参数(故而无法维护自己的作用域)造成的
解决的方法
既然知道函数调用外部变量的时候就构成了一个闭包,里面的变量会受到别的地方的影响,那么我们
现在要做的就是,构建一个只有自己本身才可访问的闭包,保存只供本身使用的变量
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.οnlοad=function(){
var btns=document.getElementsByTagName("input");
for(var i=0;i<btns.length;i++){
方法1将下标作为对象属性(name:"index",value:i的值)添加到每个数组项中
btns[i].index=i;
btns[i].οnclick=function(){
alert(this.index);
}
//方法2加一层闭包,a以函数参数形式传递给内层函数:
即构建一个只有自己本身才可访问的闭包,保存只供本身使用的变量
for(var i=0;i<btns.length;i++){
(function(a){//形参
btns[i].οnclick=function(){
alert("我是第"+a+"元素");
}
})(i);
方法3使用let定义
for(let i=0;i<btns.length;i++){
btns[i].οnclick=function(){
alert(i);
}
}
}
</script>
</head>
<body>
<input type="button" value="按钮1"/>
<input type="button" value="按钮2"/>
<input type="button" value="按钮3"/>
</body>
</html>