JS中var和let的关系,以及块作用域与闭包的关系

一、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不可以重复声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值