javascript基础学习系列十:条件声明

文章讲述了JavaScript中var和let声明变量的区别,强调了let的块级作用域特性,以及在for循环中var和let对迭代变量处理的不同。var的声明会被提升,而let则不允许在未声明时使用,避免了迭代变量的意外行为。
摘要由CSDN通过智能技术生成

在使用 var 声明变量时,由于声明会被提升,JavaScript 引擎会自动将多余的声明在作用域顶部合 并为一个声明。

因为 let 的作用域是块,所以不可能检查前面是否已经使用 let 声明过同名变量,同 时也就不可能在没有声明的情况下声明它。

<script>
 // 假设脚本不确定页面中是否已经声明了同名变量
var name = 'Matt';
// 这里没问题,因为可以被作为一个提升声明来处理 // 不需要检查之前是否声明过同名变量
let age = 36;
// 如果 age 之前声明过,这里会报错 </script>

使用 try/catch 语句或 typeof 操作符也不能解决,因为条件块中 let 声明的作用域仅限于该块。

<script>
 // 那它可以假设还没有声明过
if (typeof name === 'undefined') {
  let name;
}
// name 被限制在 if {} 块的作用域内 // 因此这个赋值形同全局赋值
name = 'Matt';
try {
console.log(age); // 如果 age 没有声明过,则会报错
}
catch(error) {
}

对于 let 这个新的 ES6 声明关键字,不能依赖条件声明模式。对于 let 这个新的 ES6 声明关键字,不能依赖条件声明模式。

2. for 循环中的 let 声明:

在 let 出现之前,for 循环定义的迭代变量会渗透到循环体外部:

for (var i = 0; i < 5; ++i) { // 循环逻辑
    }
    console.log(i); // 5

改成使用 let 之后,这个问题就消失了,因为迭代变量的作用域仅限于 for 循环块内部:

for (let i = 0; i < 5; ++i) { // 循环逻辑
}
console.log(i); // ReferenceError: i 没有定义

在使用 var 的时候,最常见的问题就是对迭代变量的奇特声明和修改:

    for (var i = 0; i < 5; ++i) {
        setTimeout(() => console.log(i), 0)
}

// 你可能以为会输出0、1、2、3、4 // 实际上会输出5、5、5、5、5

之所以会这样,是因为在退出循环时,迭代变量保存的是导致循环退出的值:5。在之后执行超时 逻辑时,所有的 i 都是同一个变量,因而输出的都是同一个最终值。

而在使用 let 声明迭代变量时,JavaScript 引擎在后台会为每个迭代循环声明一个新的迭代变量。 每个 setTimeout 引用的都是不同的变量实例,所以 console.log 输出的是我们期望的值,也就是循 环执行过程中每个迭代变量的值。

这种每次迭代声明一个独立变量实例的行为适用于所有风格的 for 循环,包括 for-in 和 for-of 循环。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值