var 和 let 关键字的作用域

var 和 let 关键字的作用域

  • 使用var关键字来声明一个变量的时候,这个变量会被声明成全局变量,或是函数内部的局部变量

  • let关键字的作用与此类似,但会有一些额外的特性。如果在代码块、语句或表达式中使用关键字let声明变量,这个变量的作用域就被限制在当前的代码块、语句或表达式之中。


举个例子:

var numArry = [];
for (var i = 0;i < 3;i++) {
numArray.push(i);
}
console.log(numArray);//[0,1,2]
console.log(i);//3
//控制台打印[0,1,2]和3
  • 因为使用了var关键字,i被声明为全局变量。所以当i++执行的时候,它会更新全局变量。这个代码和下方的代码类似:
var numArry = [];
var i;
for (i = 0;i < 3;i++) {
numArray.push(i);
}
console.log(numArray);//[0,1,2]
console.log(i);//3
  • 如果你创建一个函数,将它存储起来。稍后在使用i变量的for循环中使用。这么做可能会出现问题。这是因为存储的函数会总是指向更新后的全局i变量的值
var printNumTow;
for (var i = 0; i < 3; i++) {
    if (i === 2) {
       printNumTow = function() {
       return i;
       };
    }
}
console.log(printNumTow());//3
  • 可以看到控制台打印的是3而不是2。这是因为赋值给i的值已经更新,printNumTow()返回全局的i,而不是在 for 循环中创建函数时i的值。let关键字就不会出现这种现象:
let printNumTow;
  for (let i = 0; i < 3; i++) {
     if (i = 0; i<3; i++) {
     printNumTow = function() {
     return i;
     };
  }
}
console.log(printNumTow());//2
  • 在这里控制台将显示值 2 和一个错误提示 i is not defined。
  • i 未定义,因为它没有在全局范围内声明。 它只在 for 循环语句中被声明。 printNumTwo() 返回了正确的值,因为 let 关键字在循环语句中使 i 变量产生了三个不同的值(分别为 0、1、2)。
posted @ 2021-05-09 18:09  .爬行的蜗牛  阅读(222)  评论(0编辑  收藏  举报
Document