var和let的区别

先说区别
1.使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象; 2.使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升; 3.let不允许在相同作用域内,重复声明同一个变量。

1.基本语法

{ let a = 125; var b = 521; } a // Uncaught ReferenceError: a is not defined b // 521
上面代码中,使用let声明的变量报错,var声明的返回正确的值,这说明,let声明的变量只在它所在的代码块有效。

let配合for循环的应用

for (let i = 0; i < 5; i++) { console.log(i); //0 1 2 3 4 } console.log(i); //ReferenceError: i is not defined
上面代码中,计数器i只在for循坏体内有效,再循环体外引用就会报错。

下面是常见的面试题目:

for (var i = 0; i <10; i++) { setTimeout(function() { // 同步注册回调函数到 异步的 宏任务队列。 console.log(i); // 执行此代码时,同步代码for循环已经执行完成 }, 0); } // 输出结果 //10 共10个
如果把 var改成 let声明:

// i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被固定,不受外界干扰。 for (let i = 0; i < 10; i++) { setTimeout(function() { console.log(i); // i 是循环体内局部作用域,不受外界影响。 }, 0); } // 输出结果: 0 1 2 3 4 5 6 7 8 9
另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。

for (let i = 0; i < 3; i++) { let i = ‘love’; console.log(i); } // love // love // love
上面代码正确运行,输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。

2.不存在变量提升
var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。

let命令则不同,它所声明的变量一定要在声明后使用,否则报错。

// var 的情况 console.log(ar); // 输出undefined var ar = 512; // let 的情况 console.log(et); // 报错ReferenceError let et = 512;
上面代码变量ar用var声明,会发生变量提升,因没有值,所以会输出undefined。变量et用let声明的则不会发生变量提升。

暂时性死区

var tmp=521; if(true){ tmp=‘abc’;//ReferenceError: tmp is not defined let tmp; }
上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。(使用const声明的是常量,在后面出现的代码中不能再修改该常量的值。)

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。

// 报错 function func() { let a = 10; var a = 1; }​// 报错 function func() { let a = 10; let a = 1; }
因此,不能在函数内部重新声明参数。

function func(arg) { let arg; // 报错 }​function func(arg) { { let arg; // 不报错 } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bin,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值