多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#### **问题三: let/const/var的区别** **作用范围不同:** * let作用于代码块(即{})中; * var作用于函数中; ``` function fn1(){ for(var i=0;i<3;i++){ //for循环1 setTimeout(function(){ console.log(i);//3,3,3 },0) } for(let j=0;j<3;j++){ //for循环2 setTimeout(function(){ console.log(j);//0,1,2 },0) } console.log(i);//3 console.log(j);//报错,错误信息:Uncaught ReferenceError: j is not defined } 结果输出顺序:先输出3>后提示报错信息>然后输出3,3,3>最后输出0,1,2。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ``` 代码执行原理:先同步后异步。 循环1和循环2的输出结果不一致问题解析: 循环2结果解析: let 不存在变量提升,所以每次循环都会执行一次,声明一个新变量(只是初始化的值不一样)。for 的每次循环都是不同的块级作用域,而 let 声明的变量是块级作用域的,所以也不存在重复声明的问题。 循环1结果解析: var的作用于范围是函数内,又因setTimeout中异步函数后执行,执行时i变量值为3,所以输出结果均为3。 **声明提升区别:** * let声明的变量不会提升; * var声明的变量会提升到作用域的头部; 示例: ``` function fn2(){ console.log(v);//undefine console.log(l);//报错,错误信息:Uncaught ReferenceError: l is not defined var v = 1; let l = 2 } 1 2 3 4 5 6 ``` **重复声明区别:** * let不允许在相同作用域内重复声明; * var可以在相同作用域内重复声明 ``` function fn3(){ var a = 1; let a =1; } fn3();//报错,错误信息:Uncaught SyntaxError: Identifier 'a' has already been declared function fn4(){ let a = 1; let a = 1; } fn4();//报错,错误信息:Uncaught SyntaxError: Identifier 'a' has already ``` - const:用于声明常量,也具有块级作用域 const PI=3.14;