变量提升–带有变量提升的变量会在js创建阶段 先赋值为undefined 在运行阶段 赋值为对应值
let声明的变量 没有变量提升特性 是在声明阶段进行赋值 var声明变量有变量提升
function a(){ console.log(b);//undefine console.log(c);//会报错,错误信息:Uncaught ReferenceError: c is not defined var b = 1; let c = 2 } a()
let声明变量作用域在对应代码块{}内 只能在对应代码块内调用 且不能被再次赋值
function a(){ let b = 1; let b = 2;//会报错 错误信息:Uncaught SyntaxError: Identifier 'b' has already } a()
var声明在全局 则任何处都可以调用 声明在函数内 则在函数任意处都可以调用 声明在块内 也可以在父级域内调用(全局或某层函数)
function a(){ for(var i=0;i<3;i++){ console.log(i);//0,1,2 } for(let j=0;j<3;j++){ console.log(j);//0,1,2 } } a()
function b(){ for(var i=0;i<3;i++){ setTimeout(function(){ console.log(i);//3,3,3 },0) } for(let j=0;j<3;j++){ console.log(j);//0,1,2 setTimeout(function(){ },0) } } b()