一文详解JS中的块级作用域
JavaScript 本身一直是函数式作用域,这就是我们经常将整个 JavaScript 文件封装在一个空的立即调用函数表达式(IIFE)中的原因。这样做是为了隔离文件中的所有变量,因此全局中就不会存在变量名冲突。
现在,我们有块级作用域和两个绑定到块的新变量声明。
Let
这与var
类似,但有一些显着差异。由于它声明的变量具有块级作用域,所以可以在不影响外部变量的情况下声明具有相同名称的新局部(内部)变量。
var a = 'car' ; { let a = 5; console.log(a) // 5 } console.log(a) // car
因为它绑定到一个块(即就是 {
和 }
之间的范围),它解决了这个经典的面试问题:“输出是什么,如何让它按照你的期望工作?”
for (var i = 1; i < 5; i++){ setTimeout(() => { console.log(i); }, 1000); }
在这种情况下,它会输出 “5 5 5 5 5”,因为变量 i
在每次迭代中都会被改变,最终所有结果以最后一次变更为准。
如果您将var
切换为let
,那就不一样了。现在,每个循环都会创建一个新的块作用域,其值为绑定到该循环的值。相当于你写了:
{let i = 1; setTimeout(() => { console.log(i) }, 1000)} {let i = 2; setTimeout(() => { console.log(i) }, 1000)} {let i = 3; setTimeout(() => { console.log(i) }, 1000)} {let i = 4; setTimeout(() => { console.log(i) }, 1000)} {let i = 5; setTimeout(() => { console.log(i) }, 1000)}
var
和let
之间的另一个区别是let
不会像var
一样被提升。
{ console.log(a); // undefined console.log(b); // ReferenceError var a = 'car'; let b = 5; }
由于其更严格的范围界定和更可预测的行为,有些人表示应该使用let
而不是var
,除非特别需要用var
的声明提升或需要其更宽松的作用范围。
Const
如果你想在 JavaScript 中声明一个常量变量,那么惯例是将变量命名大写。然而,这并不能保证它是一个常量 - 它只是让其他开发人员知道这是一个常量,不应该改变。
现在我们有了const
声明。
{ const c = "tree"; console.log(c); // tree c = 46; // TypeError! }
const
不会使变量不可变,只是锁定它的赋值。 如果你有一个复杂的赋值(对象或数组),那么该值仍然可以修改。
{ const d = [1, 2, 3, 4]; const dave = { name: 'David Jones', age: 32}; d.push(5); dave.job = "salesman"; console.log(d); // [1, 2, 3, 4, 5] console.log(dave); // { age: 32, job: "salesman", name: 'David Jones'} }
到此这篇关于一文详解JS中的块级作用域的文章就介绍到这了,更多相关JS块级作用域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
最新评论