1.定义变量声明语法varupperA='A';letupperB='B';constupperC='C';只声明结果而不初始化,【const定义的常量是不可修改的,必须初始化。】//var声明变量varupperA;console.log('printuppercaseA:%s',upperA);//result:printuppercaseA:undefined//letdeclarevariablevarupperB;console.log('printUppercaseB:%s',upperB);//结果:打印大写B:undefined//constdeclareconstantconstupperC;console.log('printuppercaseC:%s',upperC);//error:SyntaxError:Missinginitializerinconstdeclaration声明后是否可以修改值,[const定义的常量不能修改,必须初始化。】//var声明变量初始化和修改值varupperA='A';console.log('printupperA:%s',upperA);//结果:printupperA:AupperA='LetterA';console.log('PrintupperA:%s',upperA);//结果:PrintupperA:LetterA//声明变量初始化和修改值varupperB='B';console.log('PrintuppercaseB:%s',upperB);//结果:打印upperB:BupperB='LetterB';console.log('PrintuppercaseB:%s',upperB);//结果:PrintupperB:LetterB//const声明常量初始化和修改值constupperC='C';console.log('printupperC:%s',upperC);//结果:printupperC:CupperC='LetterC';console.log('printupperC:%s',upperC);//错误:TypeError:赋值给常量variable.2。变量提升浏览器在运行代码前会进行预解析,先解析函数声明,定义变量,解析后运行并赋值函数和变量,不管var声明的变量是当前作用域的前几行将被提升为范围的负责人。用var声明的变量被提升到作用域的顶部并初始化为undefined,而用let声明的变量不会提升到作用域的顶部。console.log('printupperA:%s',upperA);//结果:printupperA:undefinedconsole.log('printupperB:%s',upperB);//错误:ReferenceError:upperBisnotdefinedvarupperA='A';让upperB='B';3.是否允许重复声明同一个变量**var允许在同一个作用域内重复声明同一个变量,后面声明的变量会覆盖前面声明的变量。**let不允许在同一范围内重复声明同一变量。varupperA='A';letupperB='B';//重复语句varupperA='LetterA';letupperB='LetterB';console.log('PrintupperA:%s',upperA);console.log('printupperB:%s',upperB)//错误:SyntaxError:Identifier'upperB'hasalreadybeendeclared4.在ES6之前,我们使用var来声明变量,而JS只有函数作用域和全局作用域Domain,没有块级作用域,所以{}无法限制var声明变量的访问作用域。//----------例如:------------{varupperA='A';}console.log('PrintupperA:%s',upperA);#Result:PrintupperA:A//----------ES6中的新let可以声明具有块级作用域的变量。----------{letupperB='B';}console.log('printupperB:%s',upperB);//error:ReferenceError:upperBisnotdefined5.let配合forloop独特的应用程序let非常适合用于循环内部的块作用域。**JS中的for循环体比较特殊。每次执行都是一个新的独立块作用域。用let声明的变量传入for循环体作用域后,不会发生变化,不受外界影响。影响。//----------看一道常见的面试题:----------for(vari=0;i<10;i++){setTimeout(function(){//将回调函数同步注册到异步宏任务队列中。控制台日志(一);//这段代码执行时,for循环的同步代码已经执行},0);}//输出结果:10outof10//这里的知识点:JS事件循环机制,setTimeout的机制等//----------如果把var改成letdeclaration:----------//i虽然是在全局范围内声明的,但是在for循环体局部使用的时候在范围内,变量将是固定的,不会受到外界的干扰。for(leti=0;i<10;i++){setTimeout(function(){console.log(i);//i是循环体中的局部作用域,不受外界影响。},0);}//输出结果:0123456789
