for循环中的let语句在let出现之前,for循环定义的迭代变量会穿出循环体:for(vari=0;i<5;++i){//循环逻辑}console.log(i);//5改为使用let后,这个问题就没有了,因为迭代变量的作用域被限制在for循环块内部:for(leti=0;i<5;++i){//循环逻辑}console.log(i);//ReferenceError:iisnotdefined使用var时,最常见的问题是迭代变量的奇怪声明和修改:for(vari=0;i<5;++i){setTimeout(()=>console.log(i),0)}//你可能认为它会输出0,1,2,3,4//它会输出5,5,5,5,5是这样工作的,因为当循环退出时,迭代变量保存导致循环退出的值:5.稍后执行超时逻辑时,所有i都是同一个变量,所以输出的是同一个最终值。当使用let声明迭代变量时,JavaScript引擎会在幕后为每个迭代循环声明一个新的迭代变量。每个setTimeout都指向不同的变量实例,所以console.log输出的是我们期望的值,也就是循环执行过程中每个迭代变量的值。for(leti=0;i<5;++i){setTimeout(()=>console.log(i),0)}//每次迭代都会输出0,1,2,3,4该行为声明单个变量实例适用于所有类型的for循环,包括for-in和for-of循??环。const声明const的行为与let基本相同,唯一重要的区别是用它声明的变量必须同时初始化,并且试图修改const声明的变量将导致运行时错误。const年龄=26;年龄=36;//TypeError:Assigningavaluetoaconstant//const不允许重复声明constname='Matt';constname='尼古拉斯';//SyntaxError//const声明的范围也是一个块constname='Matt';if(true){constname='Nicholas';}console.log(name);//Mattconst声明仅适用于对其指向的变量的引用。也就是说,如果const变量引用了一个对象,那么修改对象内部的属性并没有违反const限制。constperson={};person.name='Matt';//ok尽管JavaScript引擎会在for循环中为let声明创建单独的变量实例,并且const变量与let变量非常相似,但它们不能用const迭代变量声明(因为迭代变量会自增):for(consti=0;i<10;++i){}//TypeError:给常量赋值但是,如果你只想用const声明一个不会被修改的for循环变量,那也是可以的。也就是说,每次迭代只是创建一个新变量。这对于for-of和for-in循环特别有意义:leti=0;for(constj=7;i<5;++i){console.log(j);}//7,7,7,7,7for(constkeyin{a:1,b:2}){console.log(key);}//a,bfor(constvalueof[1,2,3,4,5]){console.log(value);}//1,2,3,4,5ECMAScript6增加了let和const,客观上为语言提供更好的支持,更精确地声明作用域和语义。由行为怪异的var引起的各种问题多年来一直困扰着JavaScript社区。随着这两个新关键字的出现,有助于提高代码质量的新的最佳实践也逐渐出现。总结:这样我们就可以使用admin模板来做我们的项目了,jselevation4thedition链接:https://pan.baidu.com/s/18P8k...可以加公众号获取提取码.如有不明白的请加q群147936127交流或vx:ltby52119,谢谢~
