iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >深入了解JavaScript中let/var/function的变量提升
  • 849
分享到

深入了解JavaScript中let/var/function的变量提升

2024-04-02 19:04:59 849人浏览 薄情痞子
摘要

目录前言1. let存在提升2. var/function的变量提升2.1 var的变量提升2.2 function的变量提升3. 总结前言 在我们的印象中,当提到javascrip

前言

在我们的印象中,当提到javascript中的变量提升,我们想到的是“变量和函数的声明在物理层面移动到代码的最前面“。当然这么说不大准确,变量和函数声明在代码里的位置是不会变的,而是在编译阶段被放入内存中。

可是如果我问你:let 到底有没有提升?如果有,var / let / function三者的变量提升一致吗?此时你的答案是什么?

接下来让我们来探讨这两个问题,如有错误敬请指正。

1. let存在提升

对于let是否存在提升这个问题,让我们先来看以下这段代码:

a = "global";
(function() {
    console.log(a); // undefined, 而不是打印出global
    var a;
}());

{
    console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
    let a = 1;
}

对于在函数作用域下打印出undefined,我们应该不奇怪。但引起我注意的是在块作用域下,抛出引用错误的原因是在初始化之前找不到a。那有没有可能a创建过程被提升?而在我发现ES文档中存在[var/let hoisting],这让我有理由猜测let存在提升,只是由于暂时性死区的原因,我们不能在let a之前使用 a

为了证明我的猜想,我想先从let声明的创建、初始化和赋值过程入手。

{
  let a = 0;
  a = 1;
}

上述的代码块中发生的过程如下:

  • 找到所有用let声明的变量,在环境创建变量;
  • 执行代码;
  • 执行a=0,将a初始化为1;
  • 执行a=1,对a进行赋值。

由该过程可知,如果我们在创建完变量后和初始化之前执行log()方法,控制台将会报错:

let a = 'global'
{
  console.log(a) // Uncaught ReferenceError: Cannot access 'a' before initialization
  let a = 1
}

由此一来我们就可以知道了let在创建的过程被提升,而在初始化过程没有被提升。

2. var/function的变量提升

接下来我们来看看function/var的创建、初始化和赋值过程,由此看看能否探究出它们的差别。

2.1 var的变量提升

function foo() {
  console.log(a);  // undefined
  var a = 0;
  var b = 1;
}
foo();

当我们执行foo()时,发生以下过程(较为省略):

  • foo创建环境;
  • 找到foo中所有被var声明的变量,在这个环境中创建变量;
  • 将变量初始化为 undefined;
  • 执行代码;
  • a赋值为0,b赋值为1。

由此我们可以知道var声明在代码执行前创建变量并初始化,所以当我们在var a = 0之前执行log(a)方法会得到 undefined 的结果。

2.2 function的变量提升

foo('btqf');

function foo(name) {
  console.log("my name is" + name)  // my name is btqf
}

当我们执行foo函数时,发生以下过程:

  • 找到所有function声明的变量,在环境中创建变量;
  • 将这些变量初始化并赋值;
  • 执行代码。

由此可见,function声明在代码执行前就创建、初始化并赋值。

3. 总结

  • let 的「创建」过程被提升了,但是初始化没有提升。
  • var 的「创建」和「初始化」都被提升了。
  • function 的「创建」「初始化」和「赋值」都被提升了。
  • 函数和变量相比,会被优先提升,即函数会被提升到更靠前的位置。

值得一提的是constlet基本类似,唯一的区别在于const只有创建和初始化,没有赋值过程。

到此这篇关于深入了解JavaScript中let/var/function的变量提升的文章就介绍到这了,更多相关let/var/function变量提升内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深入了解JavaScript中let/var/function的变量提升

本文链接: https://www.lsjlt.com/news/165090.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入了解JavaScript中let/var/function的变量提升
    目录前言1. let存在提升2. var/function的变量提升2.1 var的变量提升2.2 function的变量提升3. 总结前言 在我们的印象中,当提到JavaScrip...
    99+
    2024-04-02
  • JavaScript声明变量的这四兄弟(var、let、function、const)
    四兄弟的背景 在一个名为编程语言的村庄里,有不同姓氏的村民。例如Java、Python、Golang、JavaScript等姓氏,而接下来要介绍的就是JavaScript这个姓氏的一...
    99+
    2023-02-13
    JavaScript声明变量 js声明变量
  • JavaScript变量声明的var、let、const详解
    目录前言内容JavaScript的变量声明var的变量声明变量声明在函数作用域中变量重复声明变量声明提升怪异危险的varlet和const的变量声明块级作用域不可重复声明暂时性死区使...
    99+
    2024-04-02
  • JavaScript变量or循环中的var和let详解
    目录在for循环中使用var声明初始化带来的问题解决方法使用闭包使用let变量初始化for循环怎么处理用let和var声明的初始化变量?总结在for循环中使用var声明初始化带来的问...
    99+
    2024-04-02
  • JavaScript变量中var,let和const的区别
    目录前言ES5与ES6的区别1. 作用域2. 全局属性3. 变量提升与暂时性死区4. 重复声明let与const的区别1. 常量最佳实践前言 JavaScript中一共有3种用来声明...
    99+
    2024-04-02
  • JavaScript变量or循环中的var和let怎么使用
    这篇“JavaScript变量or循环中的var和let怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面...
    99+
    2024-04-02
  • 深入了解Python中的变量
    目录1 Python变量概述2 Python变量的命名3 Python变量赋值3.1 Python赋值概述3.2 Python变量的基本格式3.3 Python变量的其他赋值格式3....
    99+
    2024-04-02
  • Javascript变量函数声明提升深刻理解
    目录前言:变量提升函数提升为什么要提升?最佳实践总结前言: Javascript变量函数声明提升(Hoisting)是在 Javascript 中执行上下文工作方式的一种认识(也可以...
    99+
    2024-04-02
  • JavaScript中的变量提升和函数提升
    目录前言为什么有变量提升javascript变量提升和函数提升总结前言 在js中对变量进行操作后打印值经常会出现undefined的现象。其实原因是因为js中有一个叫做变量提升的功 ...
    99+
    2024-04-02
  • 浅析JavaScript中的变量提升
    目录前言:函数提升var变量提升let & const提升Class提升前言: JavaScript中奇怪的一点是你可以在变量和函数声明之前使用它们。就好像是变量声明和函数声...
    99+
    2024-04-02
  • JavaScript中变量提升和函数提升实例详解
    js 执行 词法分析阶段:包括分析形参、分析变量声明、分析函数声明三个部分。通过词法分析将我们写的 js 代码转成可以执行的代码。 执行阶段 变量提升 ...
    99+
    2024-04-02
  • JavaScript中的变量提升和函数提升方法
    本篇内容介绍了“JavaScript中的变量提升和函数提升方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言在js中对变量进行操作后打印...
    99+
    2023-07-02
  • JavaScript中的变量提升实例分析
    这篇文章主要介绍“JavaScript中的变量提升实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的变量提升实例分析”文章能帮助大家解决问题。前言:JavaScript中...
    99+
    2023-06-30
  • 深入了解Go语言中的变量概念
    Go语言是一种开发效率高、性能优越的现代编程语言,在Go语言中,变量是一个非常重要的概念。本文将深入探讨Go语言中的变量概念,通过具体的代码示例来帮助读者更好地理解和掌握变量的使用。 ...
    99+
    2024-04-02
  • javascript中变量提升的示例分析
    这篇文章主要介绍了javascript中变量提升的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如下所示:a = ...
    99+
    2024-04-02
  • 深入了解Python中的变量类型标注
    目录一、概述1、描述2、常用的数据类型3、mypy模块二、使用1、基本使用2、函数参数返回值添加类型标注3、混合类型检查改进4、类型别名更改一、概述 1、描述 变量类型注解是用来对变...
    99+
    2023-05-15
    Python变量类型标注 Python 类型标注 Python标注
  • 深入了解go语言的关键变量
    在 go 语言中,变量是重要的数据存储容器。基本数据类型包括布尔型、整数型、浮点型、複数字和字符串型。通过 var 关键字声明变量,并可通过短变量声明在局部范围内使用。掌握关键变量的用法...
    99+
    2024-04-08
    go语言 关键变量
  • JS中的提升机制变量提升函数提升实例详解
    目录正文一.变量提升二.函数提升三.判断顺序四.其他“提升” 1.作为import结果的声明是“提升的”;正文 对一些计算机...
    99+
    2024-04-02
  • 深入了解Java中成员变量与局部变量的使用与区别
    目录一、成员变量和局部变量的区别二、封装private关键字private的使用this关键字一、成员变量和局部变量的区别 类中位置不同:成员变量(类中方法外)局部变量(方法内部或方...
    99+
    2024-04-02
  • javascript中变量提升和闭包的示例分析
    这篇文章主要介绍了javascript中变量提升和闭包的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们先来看一个题目:<s...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作