let & var 的区别

在讲let命令之前,先来回顾一下var的一些特性和用法。

var:用于声明变量的命令

1、作用域:(ES5中仅有函数作用域&全局作用域)

(1)如果在一个函数之内用var声明变量,则其在该函数内有效,其外部环境无法访问到这个变量,且该变量在函数内会覆盖全局变量的声明。

  1. var a = 6;
  2. function hh()
  3. {
  4. var a = 4;
  5. alert(a);
  6. }
  7. hh();//4
  8. alert(a);//6

(2)如果一个变量在全局环境中声明,则其在整个window中有效。在ES5中,全局对象的属性与全局变量是等价的。

         window.a = 5; === var a =5;

2、ES5中var声明的变量存在变量提升(仅是声明提升,赋值不提升),可允许变量在声明之前使用;

  1. alert(b);//undefined
  2. var b = 5;

         其执行顺序其实是:

  1.  var b;
  2.  alert(b);
  3.  b = 5;

3、ES5中用var可以重复声明变量

  1. var c = 5;
  2. alert(c);//5
  3. var c = 10;
  4. alert(c);//10

接下来讲let的特性与用法

let:ES6中用于声明变量的新命令,其用法类似于var,但其声明的变量只在let命令所在的代码块内有效。

(什么叫代码块?{}一个大括号内的内容即可为一个代码块)

1、作用域:let命令所在的代码块

  1. {
  2. let a = 10;
  3. var b = 1;
  4. }
  5. a //ReferenceError: a is not defined
  6. b//1

2、let不存在变量提升,变量一定要在声明之后使用,否则报错

(暂时性死区:只要块级作用域内存在let命令,它所声明的变量就绑定了这个作用域,不在受外部影响,在代码块内,使用let命令声明变量之前,该变量都是不可用的)

  1. console.log(foo);//ReferenceError
  2. let foo = 2;

3、let不允许在相同作用域重复声明同一个变量(包括不能在函数内部重新声明参数)

  1. let t = 5;
  2. alert(t);
  3. let t = 8;
  4. alert(t); VM51:3 Uncaught SyntaxError: Identifier 't' has already been declared
  1. let t = 5;
  2. alert(t);//5
  3. {let t = 8; alert(t);//8} //不在同一作用域了

 

原文地址:https://www.cnblogs.com/cheeseCatMiao/p/7953558.html