前导知识点:
闭包
概念:内部函数可以访问外部函数的作用域
function fn1(){
var name="jiayu";
function fn2(){
alert(name);
}
fn2();
}
fn1();
- var变量提升(在声明之前使用,值为undefined):
console.log(a);//undefined
var a=100;
console.log(a);//100
var a="hello";
console.log(a);//hello 可以重复声明
console.log(window.a);//var声明的全局变量会附着window上,作为其属性存在
- var 声明的变量仅支持全局作用域和函数作用域,不支持代码块
if(true){
var v1=100;
var v2=200;
}
console.log(v1);//100
console.log(v2);//200
- 在for环境下使用var
var fs=[];
for(var i=0;i<5;i++){
fs[i]=function (){
console.log(i);
};//函数表达式+;
}
fs[0]();//调用时,i在for()内已经执行完毕
- 如何让i可以成为0,1,2,3,4,5
fs[i]=(function(n){
return function(){
console.log(n);
};
})(i);//立即执行函数(闭包-局部作用域)
fs[0]()//0
//const(常量)与let(变量)相似
- let不存在变量提升
console.log(a);//报错
let a=100;
console.log(a);//100
let a="hello";
console.log(a);//不可以重复声明
console.log(window.a);
//for
const fn=[];
for(let i=0;i<5;i++){
fn[i]=function(){
console.log(i);
};
}//闭包
fn[0]()//0
--拓展
const point={x:10,y:20};
console.log("This point at (" + point.x+","+point.y+")");
console.log(`This point at(${point.x},${point.y})`);
//解构赋值
let[x,y]=[2,3];
let{x:a,y:b}=point;