1.var
作用范围:函数作用域,存在变量提升,即实际解析顺序与编码位置无关(赋值前预解析)。
2.let
作用范围:块级作用域,不存在变量提升,与大多数后端语言一样。
例1:
for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i);
    }, 0);
}
//输出3 3 3原因:var为函数作用域,for遍历只是将i的值不断变化,若把var改成let,则输出0 1 2,由于let为块级作用域,每一个i存在于不同的作用域,每个定时器里面的i不同。
例2:
function fun(n) {
    //var n=undefined;   n=(n=123);
    console.log(n); //123
    var n = 456;
    console.log(n); //456
}
var n = 123;
fun(n);原因:实际运行顺序如注释所示,函数内部先定义n,然后将形参表的123给n,后赋值456;
例3:
function fun() {
    console.log(fun);
    fun = 456;
    console.log(fun);
}
var fun = 123;
fun();
//报错fun is not a function;
实际执行顺序:
var fun = undefined;
function fun = function;
function fun() {
    console.log(fun);
    fun = 456;
    console.log(fun);
}
fun = 123;
fun(); //报错fun is not a function;