利用let创建块级作用域

let关键字可以将变量绑定到所在的任意作用域中(通常是{ .. }内部)。换句话说,let为其声明的变量隐式地了所在的块作用域。

var foo = true;
if (foo) {
let bar = foo * 2;
bar = something( bar );
console.log( bar );
}
console.log( bar ); // ReferenceError

用let将变量附加在一个已经存在的块作用域上的行为是隐式的。在开发和修改代码的过程中,如果没有密切关注哪些块作用域中有绑定的变量,并且习惯性地移动这些块或者将其包含在其他的块中,就会导致代码变得混乱。


为块作用域显式地创建块可以部分解决这个问题,使变量的附属关系变得更加清晰。通常来讲,显式的代码优于隐式或一些精巧但不清晰的代码。显式的块作用域风格非常容易书写,并且和其他语言中块作用域的工作原理一致:

var foo = true;
   if (foo) {
{ // <-- 显式的快
let bar = foo * 2;
bar = something( bar );
console.log( bar );
}
}
console.log( bar ); // ReferenceError

只要声明是有效的,在声明中的任意位置都可以使用{ .. }括号来为let创建一个用于绑定的块。在这个例子中,我们在if声明内部显式地创建了一个块,如果需要对其进行重构,整个块都可以被方便地移动而不会对外部if声明的位置和语义产生任何影响。


### JavaScript 中函数作用域与块级作用域 #### 函数作用域特性 在JavaScript中,当变量被定义在一个函数内时,则该变量具有函数作用域。这意味着此变量仅能在其所在的函数内部访问,在外部则无法获取到这个变量的信息[^1]。 ```javascript function exampleFunction() { var functionScopedVariable = "I'm scoped to this function"; console.log(functionScopedVariable); // 输出: I'm scoped to this function } console.log(functionScopedVariable); // 抛出错误, 变量未定义 exampleFunction(); ``` #### 块级作用域特性 自ES6起引入了`let`和`const`关键字用于创建拥有块级作用域的变量。这种类型的变量只存在于由花括号界定的一段代码之内——比如if语句或for循环体内;一旦离开这段区域就不再可见[^5]。 ```javascript { let blockScopedVariable = 'I exist only within these curly braces'; const alsoBlockScoped = true; } // 尝试在此处打印上述两个变量会抛错,因为已经超出了它们的作用域边界 ``` #### 主要区别 - **生命周期**: 对于使用`var`声明的变量来说,即使是在条件判断或者循环结构里初始化,仍然会在整个封闭函数范围内有效甚至在整个文件(如果是顶层)下都存在。而采用`let`/`const`的方式能够更精确控制变量的存在周期,限制在特定的代码区块之中。 - **重复声明处理**: 如果尝试在同一作用域多次声明同一个名字的`var`型变量是可以接受的行为,但是这样做对于`let`和`const`就会引发语法错误,除非这些声明位于不同的嵌套层次上[^4]。 #### 实际应用案例对比 下面的例子展示了两种不同方式下的行为差异: ```javascript // 函数作用域例子 for (var i = 0; i < 3; i++) {} console.log(i); // 输出: 3 // 块级作用域例子 for (let j = 0; j < 3; j++) {} console.log(j); // ReferenceError: j is not defined ``` 在这个简单的迭代过程中可以看到,由于`i`是通过`var`声明并处于函数级别作用域之下,所以在循环结束后依旧可以在外面找到它;相反的是,利用`let`建立起来的`j`遵循着严格的块级规则,因此超出它的限定范围之后便不可再触及。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值