var 和 let、const
一、重复声明
var可以重复声明,let、const 不可以
var a = 1;
var a = 2;
let、const区别(是否可以重复赋值)
let a = 1; a = 2;
const b = 1; b = 2; 报错
二、变量提升
var可以变量提升: 将声明变量提到最前面.但是没有赋值。 let、const则报错
console.log(a);
var a = 1;
console.log(a);
三、作用域
var 不支持封闭作用域,会声明到全局作用域上 1.函数作用域 2.全局作用域
第二对括号代表立刻执行前面的匿名函数,括号内的值会作为实参传递给匿名函数。
(function(type){
console.log(type); //结果:1
})(1);
let支持块级作用域声明的变量只会声明在当前作用域内
3.1、
var会先执行外面script再执行宏任务setTimeout
let和{}配合可以产生一个作用域
for (let i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
console.log(i);
// var 3 3 3
// let 1 2 3
3.2、要想里面的宏任务跟着循环一起执行,也可以在里面加匿名函数(或者如上换let),后面的括号会立即执行前面的函数
for(var i = 0; i<3;i++){
(function (i) {
setTimeout(function () {
console.log(i);
}, 1000);
})(i);
}
3.3.域解释问题 变量提升 用let解决这个问题
暂存死区
如果作用域内 有这样一个变量 那么这个作用域内就会绑定这个变量,不会继续向上查找了
let b = 1;
{
console.log(b); //报错
let b = 2;
}