var:声明一个变量,用 var 声明的变量的作用域是它当前的执行上下文,而非声明变量总是全局的例如)(x=1)则是全局。
function m() {
x=41;
var y=10;
}
m();
console.log(x)//41
console.log(y)// y is not defined
并且var 存在变量提升在代码中的任意位置声明变量总是等于在代码开头声明
a = 1
var a;
可以理解为:
var a;
a= 1;
es6新增 const,let
const定义的变量不可以修改,而且必须初始化。
let是块级作用域,用来声明局部变量,函数内部使用let定义后,对函数外部无影响,
用let声明的变量,不存在变量提升。而且要求必须 等let声明语句执行完之后,变量才能使用。
案例:
for(var i=0;i<4;i++){
setTimeout(function () {
console.log(i)//全部是4
},0)
}
想要打印出0,1,2,3则:
for (let i=0;i<4;i++){
setTimeout(function () {
console.log(i)
},0)
}
同时let具有暂时性死区:
只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响
案例:
var tmp = 123;
if (tmp) {
tmp = 'abc'; // ReferenceError
let tmp;
}