第一章变量varconstlet的区别1。变量声明1.如果没有值传递给变量,变量是undefinedvarmsg;console.log(msg)//undefined2。var声明范围:var操作定义器的变量将成为包含它的函数的局部变量。如果在函数内部使用var定义变量,该变量会在函数启动时销毁functiontest(){varmsg='Bear';}test();console.log(msg);//报错<字体颜色=#999AAA>3。var声明提升:使用var,下面的代码不会报错,因为用这个关键字声明的变量会自动提升到函数作用域的顶部functiontest(){console.log(name);varname='Bear';}test()//undefined//之所以不会报错是因为ES运行时把他当成了下面的代码functiontest(){varname;控制台日志(名称);name='Bear';}test()//undefined2.let声明的作用和var类似,不同的是let声明的作用域是块作用域,而var声明的作用域是函数作用域if(true){varname='bear';console.log(name);//bear}console.log(name);//bearif(true){letname='bear';console.log(name);//bear}console.log(name);//ReferebceError:nameisnotdefined2.let不允许在同一个作用域内重复声明,这样会报错varname;varname;letage;letage;//错误语法错误TheidentifieragehasalreadybeendeclaredThevariabledeclaredbyletwillnotbeinthescopepromotedin//varwillraiseconsole.log(name)//undefinedvarname='bear';//letwillnotraiseconsole.log(age)//ReferenceErrorageisnotdefinedvarage=21;4.let在全局范围内声明的变量不会成为window对象的属性(var声明会)varname='bear';console.log(window.name);//bearletage=21;console.log(window。年龄);//未定义5。let出现之前for循环中的let语句,for循环定义的迭代变量会穿透到循环体外for(vari=0;i<5;i++){}console.log(i);//5改成let后,这个问题就小了,因为迭代变量只属于for循环块里面for(vari=0;i<5;i++){}console.log(i);//ReferenceErroriisnotdefined使用var最常见的问题是迭代变量的声明和修改for(vari=0;i<5;i++){setTimeout(()=>console.log(i),0)}//会输出55??555你可能会认为会输出01234//因为在释放循环时,变量保存循环退出后的值,所以输出5次,使用let变量不会导致这样的情况for(leti=0;i<5;i++){setTimeout(()=>console.log(i),0)}//会输出012343.const声明const基本类似tolet,唯一重要的区别是当用它来声明一个变量时,变量值必须同时初始化,而试图修改一个用const声明的变量会导致操作错误1.给常量const赋值name='熊';name='杰克逊';//typeError报错2.constalsoRepeateddeclarationofconstname='bear';constname='jackson'是不允许的;//SyntaxError报错3.constsound语句的作用域也是块constname='bear';if(true){constname='jackson';}console.log(name)//bear4.const的声明限制值适用于变量的引用它指向consttest={};test.name='bear';//这里可以运行4.总结1.不使用varES6相当于把var的功能拆成const和let。有了let和const,你其实会发现你又需要用var,限制自己使用const和let可以帮助提高代码质量2.const优先让let,其次是const声明,可以强制浏览器保持变量在运行时不变,同时快速检测这种意外行为的意外赋值。总之,const定义了一些不会改变的变量,会改变的用let定义。