let 变量提升

简介: let 变量提升

在ES6之前,JS的scope只有两种,全局作用域和函数作用域,但是在ES6种出现了块级作用域,即使用let/const可以定义块级作用域。let/const与var的主要不同有两个地方:

let/const是使用区块作用域;
var是使用函数作用域
在let/const声明之前就访问对应的变量与常量,会抛出ReferenceError错误;
但在var声明之前就访问对应的变量,则会得到undefined

那么let有没有变量提升?请看以下例子:

var foo = "outer";
  function x() {
    console.log(foo); // ReferenceError: `foo` is not defined
    let foo = "inner";
    console.log(foo);
  }
  x();

函数的执行结果是报错,如果没有变量提升,那么这个函数的执行结果应该是外层的foo="outer"才对。那么你如何解释let没有变量提升呢?

在MDN文档中对let和const有这样一段描述:

let和声明的变量const也会被提升,但与var变量不同的是,它们没有用默认值 初始化undefined。在执行它们被初始化的那一行之前,任何访问这些变量的代码都会抛出异常。原文:地址。这个地址是MDN英文版本的注解,但是在中文版本居然没有这段注释。

与通过var声明的有初始化值 undefined 的变量不同,通过 let 声明的变量直到它们的定义被执行时才初始化。在变量初始化前访问该变量会导致 ReferenceError。该变量处在一个自块顶部到初始化处理的“暂时性死区”中,也就是我们所说的TDZ。

什么是暂时性死区(TDZ)

Temporal Dead Zone(TDZ)是ES6(ES2015)中对作用域新的专用语义。TDZ名词并没有明确地写在ES6的标准文件中,一开始是出现在ES Discussion讨论区中,是对于某些遇到在区块作用域绑定早于声明语句时的状况时,所使用的专用术语。

注意这里的暂时性,既然是暂时性那么使用上该区域取决于执行顺序(时间)而不是代码编写的顺序(位置)。例如下面的代码有效,因为即使使用该let变量的函数 出现在声明变量之前,该函数也会在 TDZ 之外调用。

{
    // TDZ starts at beginning of scope
    const func = () => console.log(letVar); // OK
    let letVar = 3; // End of TDZ (for letVar)
    func(); // Called outside TDZ!
}

上面代码会打印出:'3'。

变量提升

1、test1方法输出什么?
function test1(v){
  console.log(v)//输出10
  var v = 3
}
test1(10)
2、test2方法输出什么?
function test2(v){
   var v = 5
   var v
   console.log(v) //答案是5
}
test2()


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