1. var申明晋升
    console.log(name)  //土豆var name = '土豆';

    应用var申明的变量会主动晋升到函数作用域的顶部

    function foo(){    console.log(name);    var name = "土豆";}foo()  //undefined//等价于function foo(){    var name;    console.log(name);    name = "土豆";}foo(); //undefined
    console.log(name)  //ReferenceError name没有被定义let name ="土豆";

    而应用let定义的name不会被晋升,报出ReferenceError的谬误;

  2. var能够反复申明同一个变量
    var name = "番茄";var name = "西瓜";var name = "土豆";console.log(name);//土豆

    而应用let反复申明同一个变量会报错。

    var name = "土豆";let name = "土豆";console.log(name);//'name' has already been declared
    let name = "土豆";var name = "土豆";console.log(name);//Cannot redeclare block-scoped variable 'name'.
  1. var全局申明
    var name = "土豆";console.log(window.name);//土豆let age = "24";console.log(window.age);  //undefined

    应用var定义的变量会被挂载到window上,成为window对象的属性,而应用let不会。

  2. 作用域
    if(true){    var name = "土豆";    console.log(name);}console.log(name);//土豆//土豆if(true){    let age = 24;    console.log(age);}console.log(age);//24//undefined

    应用var申明的范畴是函数作用域,应用let申明的范畴是块作用域。