一、var和let的作用域比较
可以在浏览器中按下F12选择控制台运行以下JS代码
{
var num1=1;
let num2=2;
const num3=3;
}
console.log(num1); //1
console.log(num2); //nums2 is not defined
console.log(num3); //nums3 is not defined
1、只有num1(var)会被打印,num2(let)和num3(const)的作用域仅限于花括号内(块作用域);
2、需要注意的是,虽然函数也是用花括号包的,但函数的花括号里面是闭包;
3、for循环语句是块作用域,for(let i=0;…),循环体外无法访问i,但是for(var j=0;…)的话,循环体外可以访问j。
for(let i=0;i<3;i++){}
console.log(i); //i is not defined
for(var j=0;j<3;j++){}
console.log(j); //3
二、块作用域与闭包的关系
1、闭包属于块作用域的一种,但闭包的约束力更强;
2、闭包的概念:函数与其创建时所带有的作用域对象的组合。
3、即函数内由var、let、const定义的数据,函数外均无法访问;
4、可以理解为闭包的约束能力大于var的全局声明能力,所以函数外无法访问var声明的变量;
JS
function func(){
var nu1=1;
let nu2=2;
const nu3=3;
}
func();
console.log(nu1); //nu1 is not defined
console.log(nu2); //nu2 is not defined
console.log(nu3); //nu3 is not defined
三个数据均无法被打印,会被提示未定义,因为这个三个数据在函数的闭包内,外部无法访问。
三、变量提升
console.log(str1); //undefined
console.log(str2); //str2 is not defined
var str1="str1";
let str2="str2";
分别会输出:
undefined
Uncaught ReferenceError: str2 is not defined
1、var可以先使用后声明(声明会被提升到执行语句之前),不会报错,但写在声明语句前的var型变量值为undefined;
2、let必须先声明才能使用。
四、重复声明
1、var可以重复声明;
2、let不可以重复声明。