javaScript的面试重点--预解析

目录

一.前言

二.预解析案例


一.前言

        关于预解析,我们通过今天学习就能够知道解析器运行JS分为哪两步;能够说出变量提升的步骤和运行过程;能够说出函数提升的步骤和运行过程。

二.预解析案例

        预解析,简而言之,也就是javaScript解析器在运行javaScript代码的时候所进行的第一步。第二步则就是执行代码,按照代码书写的顺序从上往下执行。

        在预解析过程中,JS引擎会把JS里面所有的var还有function提升到当前作用域的最前面。其中预解析又可以分为变量预解析(变量提升)和函数预解析(函数提升)。

        下面我们来分析下以下代码的执行结果:

console.log(num1)
    var num1=10

       

         在我们声明赋值num1变量的前面,就执行了输出num1的表达式,这样的结果会是什么呢?

我们来看下执行结果:

        

        通过运行编译我们会发现我们的执行结果是undefined,为什么会是这样的结果呢?

       这就是我们预解析的神奇之处,下面我们来分析下这个预解析的详细过程。

        因为上面那个案例有变量的声明,根据我们的变量预解析,再将变量提升之后,实际上执行的代码如下:

        

​
    var num1;
    console.log(num1)
    num1=10

​

         

        到这里我们就可以知道,变量提升就是把所有的变量声明提升到当前作用域的最前面,但不提升赋值操作。因此这里我们的num1在声明之后,由于没有赋值,所以得到的结果自然也就是undefined了。

       

        下面我们再来看看函数的预解析:

        首先分析下下面这段代码的执行结果会是什么样的:

        

function fn(){
      var a=b=c=7
      console.log(a)
      console.log(b)
      console.log(c)
    }
    fn()
    console.log(c)
    console.log(b)
    console.log(a)

        结果可能出乎大家的意料哦,现在让我们来看下结果:

        

        我们可以发现最后的结果是输出5个7,跟最后一个未定义的报错提示。

         现在我们来分析下结果,由于我们用var声明多个变量的格式为:

var a=7,b=7,c=7

         中间只需用逗号隔开就可以了,而案例中的声明其实是这样的结果:

var a=7;
b=7;
c=7

       在函数中,没有使用var声明的变量就会从局部变量转为全局变量,也就是说,案例中的b和c此刻都变成了全局变量。

        因此我们在执行fn()这个函数的时候,就会把a,b,c的值都输出出来,也就是3个7。再执行b和c的输出,就把剩下的2个7给输出来。由于a使用了var声明,因此我们的a依然是fn函数里面的局部变量。因此最后的结果自然就是undefined啦。

        最后,函数的提升也就是把所有的函数声明提升到当前作用域的最前面,但不调用函数。

 

 

       

        

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798153.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gstreamer学习3.1------使用appsrc灌颜色信号数据

这个视频内容讲解的离散余弦变换,讲的很好, 离散余弦变换可视化讲解_哔哩哔哩_bilibili 其中讲到,把颜色变化转换为曲线的处理, 在前面的学习中,我们知道了可以向appsrc来灌数据来进行显示 Gstreamer学习3----灌数据…

昇思25天学习打卡营第21天|基于MindSpore的DCGAN生成漫画头像

基于MindSpore的DCGAN生成漫画头像 GAN基础原理 生成对抗网络(GAN)的基础原理是通过两个互相博弈的模型,生成模型和判别模型,来实现对数据分布的学习并产生新的、与真实数据极其相似的数据实例。 生成对抗网络(GAN&a…

SwiftUI 截图(snapshot)视频画面的极简方法

功能需求 在 万物皆可截图:SwiftUI 中任意视图(包括List和ScrollView)截图的通用实现 这篇博文中,我们实现了在 SwiftUI 中截图几乎任何视图的功能,不幸的是它对视频截图却无能为力。不过别着急,我们还有妙招。 在上面的演示图片中,我们在 SwiftUI 中可以随心所欲的截图…

【python数据结构精讲】双端队列

通过总结《流畅的Python》等书中的知识,总结Python中常用工具的方法。 deque,学名双端队列。 1. 常用方法 append():队列尾部添加appendleft():队首添加pop():移除队列最后一个元素popleft():移除队列第一…

Reinforced Causal Explainer for GNN论文笔记

论文:TPAMI 2023 图神经网络的强化因果解释器 论文代码地址:代码 目录 Abstract Introduction PRELIMINARIES Causal Attribution of a Holistic Subgraph​ individual causal effect (ICE)​ *Causal Screening of an Edge Sequence Reinforc…

springboot上传图片

前端的name的值必须要和后端的MultipartFile 形参名一致 存储本地

PDF公式转Latex

文章目录 摘要数据集 UniMER介绍下载链接 LaTeX-OCRUniMERNet安装UniMER 用的数据集介绍下载链接 PDF-Extract-Kit整体介绍效果展示评测指标布局检测公式检测公式识别 使用教程环境安装参考[模型下载](models/README.md)下载所需模型权重 在Windows上运行在macOS上运行运行提取…

FastAPI 学习之路(四十四)WebSockets

我们之前的分析都是基于http的请求,那么如果是websockets可以支持吗,答案是可以的,我们来看下是如何实现的。 from fastapi import WebSocket, FastAPI from fastapi.responses import HTMLResponseapp FastAPI()html """&…

基于JavaMailSenderImpl和velocity模板的邮件发送

Java邮箱集成发送&#xff0c; 本文介绍了基于JavaMailSenderImpl和velocity模板引擎&#xff0c;发送自定义的邮件内容。 一、依赖引入 <dependency><groupId>com.crygier</groupId><artifactId>SpringUtils</artifactId><version>1.0.…

秋招突击——7/12——复习{每日温度、完全平方数、无重复最长子串}——新作{字节面试——控制多线程按照顺序输出}

文章目录 引言复习每日温度复习实现参考学习 完全平方数复习实现参考学习 无重复字符的最长子串复习实现参考学习 新作控制多线程输出Java实现线程——不使用锁实现使用synchronized关键实现——使用锁实现使用synchronized、wait和notify关键字实现 总结 引言 今天又要面试字…

CSS相对定位和绝对定位的区别

CSS相对定位和绝对定位的区别 区别1&#xff1a;相对的对象不同 相对定位是相对于自己绝对定位是相对于离自己最近的有定位的祖先 区别2:是否会脱离文档流 相对定位不会脱离文档流&#xff0c;不会影响其他元素的位置绝对定位会脱离文档流&#xff0c;会影响其他元素的布局 代…

MAC通过SSH连接VirtualBox中的虚拟机

1、虚拟机网络连接方式使用桥接方式-桥接网卡 2、重启虚拟机&#xff0c;查看虚拟机ip地址是否跟Mac宿主机在同一网段 3、SSH工具&#xff08;推荐Tabby&#xff09;输入IP、用户名和密码就能连接虚拟机了

JS进阶-异常处理

学习目标&#xff1a; 掌握异常处理 学习内容&#xff1a; throw抛异常try/catch捕获异常debugger throw抛异常&#xff1a; 异常处理是预估代码执行过程中可能发生的错误&#xff0c;然后最大程度的避免错误的发生导致整个程序无法继续运行。 <title>throw抛异常</…

基于AT89C51单片机的多功能自行车测速计程器(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的多功能自行车测速计程器的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 选题背景 原理图 PCB图 仿真图 代码 系统论文 资源下载 选题背景 美丽的夜晚&…

Ubuntu 安装 XRDP,替代系统自带RDP远程桌面

起因&#xff0c;Ubuntu的自带RDP远程桌面很好用&#xff0c;但很傻卵&#xff0c;必须登录。 而设置了自动登录也不能解开KEYRING&#xff0c;必须必须必须用GUI手动登录。 &#xff08;我远程我用头给你坐机子面前开显示器先登录&#xff1f;&#xff1f;&#xff09; 比起VN…

Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git)

目录 Linux软件包管理器 - yum Linux下安装软件的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 vim的简单配置 Linux编译器 - gc…

网络技术相关知识概念

网络技术&#xff1a; 进程&#xff08;Process&#xff09; 定义&#xff1a;进程是程序的一次执行过程&#xff0c;它有自己的内存空间和系统资源&#xff08;资源独立&#xff09;。特性&#xff1a; 每个进程都有唯一的PID&#xff08;进程ID&#xff09;。进程间通信&am…

笔记 4 :linux 0.11 中继续分析 0 号进程创建一号进程的 fork () 函数

&#xff08;27&#xff09;本条目开始&#xff0c; 开始分析 copy_process () 函数&#xff0c;其又会调用别的函数&#xff0c;故先分析别的函数。 get_free_page &#xff08;&#xff09; &#xff1b; 先 介绍汇编指令 scasb &#xff1a; 以及 指令 sstosd &#xff1a;…

Vue1-Vue核心

目录 Vue简介 官网 介绍与描述 Vue的特点 与其它 JS 框架的关联 Vue周边库 初识Vue Vue模板语法 数据绑定 el与data的两种写法 MVVM模型 数据代理 回顾Object.defineProperty方法 何为数据代理 Vue中的数据代理 数据代理图示 事件处理 事件的基本使用 事件修…

Appium自动化测试系列: 2. 使用Appium启动APP(真机)

历史文章&#xff1a;Appium自动化测试系列: 1. Mac安装配置Appium_mac安装appium-CSDN博客 一、准备工作 1. 安卓测试机打开调试模式&#xff0c;然后使用可以传输数据的数据线连接上你的电脑。注意&#xff1a;你的数据线一定要支持传输数据&#xff0c;有的数据线只支持充…