JS中用var和let声明变量的异同

When you declare a variable with the var keyword, it is declared globally, or locally if declared inside a function.

当使用var关键字声明变量时,它是全局声明的(在循环语句中声明也是全局的),如果在函数内部声明,则是局部声明的。

The let keyword behaves similarly, but with some extra features. When you declare a variable with the let keyword inside a block, statement, or expression, its scope is limited to that block, statement, or expression.

let关键字的行为类似,但有一些额外的功能。在块、语句或表达式中使用let关键字声明变量时,其作用域仅限于该块、语句和表达式。

PS: 另外,let和const都会检查有无重复变量名,若当前定义的变量名已经存在,则报错提示,方便纠察代码。而var没有此功能。

for (var i = 0; i < 3; i++) {
}
相当于
var i;
for (i = 0; i < 3; i++) {
}

for循环里var i变量的值会变成最新更新的值,即i将始终引用更新的全局i变量的值,返回
全局i,而不是在当前当次for循环中创建函数时i的值。如:
var printNumTwo;
for (var i = 0; i < 3; i++) {
  if (i === 2) {
    printNumTwo = function() {
      return i;
    };
  }
}
console.log(printNumTwo()); //3
console.log(i); //3 因为var是全局声明的,故这里出了for循环也能取到i的值。

这里得出的是3而不是2,这是错误的。这是因为分配给i的值已更新,printNumTwo()返回全局i,而不是在for循环中创建函数时的值。

用let关键字定义变量则不会如此,以上例子将var修改为let即可得到正确值:

var printNumTwo;
for (let i = 0; i < 3; i++) {
  if (i === 2) {
    printNumTwo = function() {
      return i;
    };
  }
}
console.log(printNumTwo()); //2
console.log(i); //报错:
ReferenceError:i is not defined. let声明会报此错!因为超出了范围。


对于错误“ReferenceError: i is not defined”,报此错是因为这里用let声明i,故i不是在全局范围中声明的,它仅在for循环语句中声明。

printNumTwo()返回了正确的值,因为循环语句中的let关键字创建了三个具有唯一值(0、1和2)的不同的i变量!!!

 

  


 
posted @ 2022-09-12 11:16  枭二熊  阅读(79)  评论(0编辑  收藏  举报