作用域与声明变量的3个关键字:var、let、const

116 阅读1分钟

1、var声明

var声明的范围是函数作用域,使用var在一个函数内部定义变量,就意味着该变量将在函数退出时被销毁。如下所示:

function test() {
    var age = 21;
  }
  test();
  console.log(age);  //出错!

在函数内部定义变量时省略var操作符,则会创建一个全局变量:

  function test() {
    age = 21;
  }
  test();
  console.log(age); // 21

var声明的变量会自动提升到函数作用域顶部,如果在声明变量语句之前,使用该变量并不会报错:

function test() {
    console.log(age);
    var age = 21;
  }
  test(); // undefined 

虽然未报错,但是由于该变量只是声明提升了,但是赋值初始化的操作并没有提升,所以输出undefined,上面那段代码等同于:

function test() {
    var age;
    console.log(age);
    age = 21;
  }
  test(); // undefined 

2、let声明

与var相比,有以下区别:

1、let声明的范围是块作用域。

2、let不允许同一个块中出现冗余声明。

3、let声明的变量不会在作用域中被提升。

4、使用let在全局作用域中声明的变量不会变为window对象的属性,使用var声明的变量则会。

let name='zs';
console.log(window.name);  // undefined

var name_2='ls';
console.log(window.name);  // 'ls'

3、const声明

let的唯一一个重要区别就是:使用const声明变量时,必须同时初始化该变量,且不可修改该变量指向的引用(可以修改对象内部的属性)。

相同点:const也不允许重复声明、const声明的作用域也是块。

最佳声明风格:

1、不使用var

2、const优先,let次之(使用const声明可以让浏览器运行时,强制保持变量不变,也有助于发现一些意外赋值行为)