Day17 - let是否会造成变量提升

简介: Day17 - let是否会造成变量提升

知识点讲解


什么是提升 (Hosting)


今天谈到这个单词最多的地方还是尤大神在Vue3中的静态提升。


回到原题我们说说什么是提升。引擎会在解释JavaScript代码之前首先对其进行编译,编译过程中的一部分工作就是找到所有的声明,并用合适的作用域将他们关联起来,这也正是词法作用域的核心内容。


变量提升


var a = 8;
(function() {
  console.log(a)
  var a = 1
})()


日志中输出 undefined而不是 8 是因为,编译时会检查代码找出函数作用域中的变量声明,放在作用域的前面。


// 模拟提升后的代码
var a = 8;
(function() {
  var a
  console.log(a)
  a = 1
})()


函数提升


类似的还有函数提升。


(function() {
  f()
  function f() {
    console.log('go')
  }
})
f()


let是否提升


其实let也会有类似的现象,只是程序并没有进行函数声明。


var a = 8;
(function() {
  // let a 此时暂时性死区开始
  console.log(a); // Uncaught ReferenceError: x is not defined
  //暂时性死区结束
  let a = 1
}())


暂时性死区 (Temporal Dead Zone)


这种现象叫做暂时性死区


引用MDN上的定义


let bindings are created at the top of the (block) scope containing the declaration, commonly referred to as “hoisting”. Unlike variables declared with var, which will start with the value undefined, let variables are not initialized until their definition is evaluated. Accessing the variable before the initialization results in a ReferenceError. The variable is in a “temporal dead zone” from the start of the block until the initialization is processed.


大概意思便是let同样存在变量提示(hoisting),只是形式与var不同,var定义的变量将会被赋予undefined的初始值,而let在被显式赋值之前不会被赋予初始值,并且在赋值之前读写变量都会导致 ReferenceError 的报错。从代码块(block)起始到变量求值(包括赋值)以前的这块区域,称为该变量的暂时性死区。


面试攻略


面试的时候很多时候会出现为一个概念而带来的争论。就比如今天这道提升和不提升,提升的概念是因为什么的情况。然叔的攻略是:


  • 陈述客观事实


  • 代码现象


  • MDN与红宝书记述


  • 没必要一定说出判断,毕竟判断句是讨论的句号,是被diss的开始。


只要让别人知道你的实力就行了,没必要跟他纠缠尤雨溪是否有Vue的实战经验的事情。


相关文章
|
3月前
|
存储 缓存 JavaScript
哪些情况适合使用块级作用域,哪些情况适合使用函数作用域?
【10月更文挑战第29天】块级作用域和函数作用域在不同的场景下各有优势,合理地选择和运用这两种作用域可以使JavaScript代码更加清晰、高效和易于维护。在实际开发中,需要根据具体的业务需求、代码结构和编程模式来决定使用哪种作用域,或者在适当的情况下结合使用两者,以达到最佳的编程效果。
|
3月前
|
JavaScript 前端开发
块级作用域和函数作用域有什么区别?
【10月更文挑战第29天】块级作用域和函数作用域在JavaScript中各有特点和用途。块级作用域提供了更精细的变量控制,有助于避免变量提升和意外的全局变量污染等问题;而函数作用域则在函数封装和模块化编程等方面有着重要的应用。在实际开发中,需要根据具体的需求和场景合理地选择使用哪种作用域来声明变量和组织代码。
|
4月前
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
7月前
|
编译器
C 中的变量声明
【7月更文挑战第2天】C 中的变量声明。
42 1
|
9月前
|
C++
c++变量作用域
c++变量作用域
86 2
|
9月前
|
JavaScript
块级作用域、变量提升
块级作用域、变量提升
37 1
|
8月前
|
JavaScript
JS 块级作用域、变量提升
JS 块级作用域、变量提升
|
9月前
|
C++
C++ 变量作用域
C++ 变量作用域
65 0
|
编译器 C语言
C中的变量声明
C 中的变量声明。
77 3
|
JavaScript 前端开发
Day16 - 为什么一定要有块级作用域
Day16 - 为什么一定要有块级作用域
160 0