1、变量范围 当我们在函数外部定义变量时,这些var变量属于全局范围。例如: 在本例中,counter是一个全局变量。这意味着该counter变量可以被任何函数访问。 当我们使用关键字在函数内声明变量时var,变量的范围是局部的。例如:functionincrease(){varcounter10;}cannotaccessthecountervariablehere 在这个例子中,counter变量是increase()函数的局部变量。它不能在函数之外访问。 以下示例在循环内显示从0到4的四个数字,在循环外显示数字5。for(vari0;i5;i){console。log(Insidetheloop:,i);}console。log(Outsidetheloop:,i); 输出:Insidetheloop:0Insidetheloop:1Insidetheloop:2Insidetheloop:3Insidetheloop:4Outsidetheloop:5 在此示例中,i变量是全局变量。因此,可以从循环内部和for循环之后访问它。 以下示例使用let关键字而不是var关键字:for(leti0;i5;i){console。log(Insidetheloop:,i);}console。log(Outsidetheloop:,i); 在这种情况下,代码在循环中显示了从0到4的四个数字和一个引用错误:Insidetheloop:0Insidetheloop:1Insidetheloop:2Insidetheloop:3Insidetheloop:4 错误:UncaughtReferenceError:iisnotdefined 由于此示例使用let关键字,因此该变量i是阻塞范围。这意味着该变量i仅存在并且可以在for循环块内访问。 在JavaScript中,一个块由一对花括号分隔,{}就像在if。。。elseandfor语句中一样:if(condition){insideablock}for(。。。){insideablock}2、创建全局属性 全局var变量作为属性添加到全局对象中。全局对象位于Web浏览器和Node。js上:windowglobalvarcounter0;console。log(window。counter);0 但是,let变量不会添加到全局对象中:letcounter0;console。log(window。counter);undefined3、重新声明 var关键字允许我们重新声明变量而不会出现任何问题:varcounter10;console。log(counter);10 但是,如果我们用let关键字重新声明一个变量,我们会得到一个错误:letcounter10;error4、时间死区 let变量有时间死区,而var变量没有。为了理解时间死区,让我们检查一下var和let变量的生命周期,它们有两个步骤:创建和执行。 var变量 在创建阶段,JavaScript引擎将存储空间分配给var变量,并立即将它们初始化为undefined。 在执行阶段,JavaScript引擎将分配指定的值分配给var变量(如果有的话)。否则,var变量保持未定义。 有关详细信息,请参阅执行上下文。 let变量 在创建阶段,JavaScript引擎为let变量分配存储空间,但不初始化变量。引用未初始化的变量将导致ReferenceError。 let变量与var变量具有相同的执行阶段。 时间死区从块开始,直到处理了let变量声明。换句话说,它是在定义之前无法访问let变量的位置