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;