JS之预解析

2023-11-13


javascript 的预解析:(个人理解)就是js代码在执行之前 会在相应的执行环境中 预先把 一些东西解析到内存。如果理解错误,请多多指正大笑吐舌头

一. 那究竟预先解析哪些东西那??答:预先解析 function 和 var

二. 还有就是预解析的顺序是怎们样的?

1首先是找到<script></script>标签按照<script>块依次解析(最后会有说明)

2 解析执行环境(这个有点难理解,在下面有具体解释)

3 对标识符( var function)进行解析


接下来结合我的测试代码一一解释:

<script>
        test(); // This is test
        function test()
        {
            alert('This is test');
        }
</script>


以上案例,在function test()之前就调用了test()函数照样可以弹出 This is test

可见在js执行之前就预先把function test解析到了内存,所以调用test() 照常弹出结果;

接下来看看变量的预解析:

<script>
        alert(test);//undefined
        var test="this is test";
        alert(test);//this is test
</script>

在var test=“test”,之前就调用alert弹出test,而没有 报test未定义的错误,而是弹出了undefined,可见在js执行之前就预先把var test;解析到内存,所以不会报错,为什么会弹出undefined是因为,只是把var test的定义预先解析到内存,并没有给变量赋值;

var test="this is test";


当我们执行完这句话的时候,就完成了赋值,所以再次调用alert就弹出this is test

 

接下来继续看:变量和函数重名的时候会是什么情况?

<script>
        alert(test); //function(){ return  " this is function"} 
        var test="this is test";
        function test(){ 
            return "this is function"; 
        }
        alert(test); // this is test
        alert(test()); // this is function
</script>


这段代码证明了,当函数名和变量名一样的时候,alert(test);调用的是函数function test() 的指针,而不是调用的变量var test; 所以function的预解析 优先级 高于var(个人觉得)

 

接下来说说“  解析执行环境 ”是什么意思??看下面的例子

 

<script>
        function test(){
            var msg ='This is test';
        }
        alert(msg); // 报错msg未定义
</script>

 

可能有人会有疑问了,按照上面说的js不是会预解析function 和 var msg吗,我在function 里面定义了var msg ,那为什么调用回报错那???

答案就和我们上面提到的 “解析执行环境” 有关系,在js执行之前是会预解析function 和var 没错,但是在本例中 他们“解析执行环境”不同.

Function test是在一个全局的环境中,而msg是function  test中定义的一个局部变量,msg的“解析执行环境”是在function test这个函数里面(这里可以理解为function test里的局部环境),所以当我们在全局这个环境中alert(msg),的时候,并没有定义msg这个变量或者函数,所以就报错了;

为了进一步理解,把上面的例子加以修改

 

<script>
        alert(msg); // undefined
        function test()
        {
            alert(msg2);//undefined
            var msg2 ='This is test';
        }
         var msg = "123";
       test(); 
 </script>


这个例子,js在执行之前预解析,解析全局的环境,解析到function test 和 var msg ;所以alert(msg);会弹出undefined

 然后当程序执行到test(); 的时候会进入function test里面去,也就是进入function test 的局部环境去 预解析,这时候解析到 var msg2,所以也弹出了undefined


为了理解的更清楚,可以用IE的F12打个断点看一下

 

程序开始预解析的时候,实在Global这个全局的执行环境中,解析到了function test 和msg


 

当我们执行test()的时候,就会进入function test里面这个局部执行环境去解析了


 

上图可以看到黄色的箭头 有原来的Global 执行环境,变成了test则个局部执行环境了,然后再function test这个局部执行环境中预解析,此时就解析到了 var msg2 这个变量

 

 

到这应该可以理解“解析执行环境”这句话了吧,如果还不明白自己动手搞了例子,打个断点debug一下下面这段代码,应该就清楚了!

<script>
        var a = "我是全局的a";
        var b = " 我是全部的b";
        function fun1(){
            var a = "我是局部的a";
            alert(a);
            function fun2(){
                alert(a);
                alert(b);
            }
            func2();
        }
        fun1();
</script>


最后说明一下“1首先是找到<script></script>标签按照<script>块依次解析” 这句话是什么意思那?

我们的代码中可能会有多个<script>...</script>标签,每一个<script>...</script>标签我们认为是一个<script>块;js的预解析式按照<script>块来进行的;也就是说js预解析不会跨<script>进行预解析什么意思那?看下面代码

 

<script>
        alert(msg);
        //test();
</script>
<script>
        var msg ="test";
        /* function test(){
         alert("this is function");
         }*/
</script>

这里有两个script块,他们是按照顺序进行预解析的,我们在第二个script块中定义的var msg,而在第一个script块中alert(msg)

显然在第一个script快中并没有预解析到一个叫msg的变量或者函数,而js又不会跨到第二个script块去解析,所以就报错msg未定义


函数function test 也一样

 

 

如果把两个script块调换一下位置,结果就不一样了

<script>
        var msg ="test";
        function test(){
            alert("this is function");
        }
</script>
<script>
      alert(msg);  // test
      test(); // this is function
</script>

script块顺序进行预解析,当第一个script块预解析完,会解析到var msg 和function test,

当再第二个script块中调用alert(msg);和test();时上面的js程序已经执行完毕了,自然会弹出 test 和this is function

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS之预解析 的相关文章

  • 软件测试基础知识(7)——因果图法

    因果图法 定义 因果图法是一种利用图解法分析输入的各种组合情况 从而设计测试用例的方法 它适合于检查程序输入条件的各种组合情况 特点 1 考虑输入条件的相互制约及组合关系 2 考虑输出条件对输入条件的制约关系 因果图法产生的背景 等价类划分
  • 高可用集群HA、LVS+Keepalived、健康检测

    keepalived是集群管理中保证集群高可用 HA 的一个服务软件 其功能类似于heartbeat 用来防止单点故障 2 工作原理 keepalived是以VRRP协议为实现基础的 当backup收不到vrrp包时就认为master宕掉了
  • 快速排序c++实现

    思想 用过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另外一部分的所有数据要小 然后再对这两部分重复此步骤 直到整个数组变成有序序列 对一个数组实现一趟快速排序的过程 1 定义两个变量 一个指向数组最前 一个指向最后
  • uniapp开发的scroll-view的x轴滑动两端不能够完全显示的修改

    uniapp开发多端应用 做一个scroll view后 在h5可以完全显示 app也可以 就是在小程序端两侧都不能够完全显示 把官方简单的示例代码复制下来调试 发现问题在于scroll view层的class的width 如果设置成100
  • HC-05(ZS-040)蓝牙模块使用详情(蓝牙模块配置、手机蓝牙控制单片机、蓝牙与蓝牙之间的通信)含51、32程序

    HC 05是一款主从一体化的蓝牙模块 因此其使用起来比较方便 只需要进行简单的配置即可 本文就手把手的介绍小白入手模块后如何使用 对于模块使用 1 蓝牙配置 2 手机与蓝牙的传输 3 手机通过蓝牙模块控制单片机 4 一对蓝牙之间主 从传输数
  • java随机抽题系统_随机抽取试题(java+sql 2005)

    import java awt BorderLayout import java util import java awt event import java awt Container import java awt EventQueue
  • 强啊,点赞业务缓存设计优化探索之路。

    背景 内容点赞业务在得物社区中是一个非常高频的业务场景 功能本身复杂度不高 但是业务场景多 QPS高 而且由于社区的用户体量 整体点赞的数据量非常大 其中最核心 对响应性能要求最高的主要是 用户是否点赞内容 和 内容点赞数 场景 在得物社区
  • fgets 函数详解

    描述 C 库函数 char fgets char str int n FILE stream 从指定的流 stream 读取一行 并把它存储在 str 所指向的字符串内 当读取 n 1 个字符时 或者读取到换行符时 或者到达文件末尾时 它会
  • PID ------------------------------------

    28条消息 位置式PID和增量式PID的区别 转载 zhangfengmei1987的博客 CSDN博客 位置式pid 28条消息 自动驾驶 PID实现轨迹跟踪 python实现 C 实现 CHH3213的博客 CSDN博客 轨迹跟踪 P
  • webpack 插件实战笔记(一)

    cnpm init 111Air webpackSerial1 i cnpm init This utility will walk you through creating a package json file It only cove
  • FCOS代码复现错误集合

    在我复现无锚框检测神网络 FCOS时 官方代码 FCOS master令我头疼不已 现将问题总结如下 仅供参考 1 from fcos core import C 遇到这个问题抓耳挠腮了好久 尝试过各种方法 最后不得已 在文件所在目录下重新
  • 图像处理中涉及的灰度图、彩色图以及深度图概念

    图像处理中涉及最多的概念就是图像的类型 为了很好的理解图像的概念以及处理图片 我们就需要对常见的图像具有一定的概念 我们首先介绍一下生活中常见的图像格式 1 bmp格式 这是一种不常见的图像格式 一般为无损图像 没有对图像进行压缩 占用的存
  • Java 脱敏工具类总结

    开发过程中 会遇到很多敏感数据的显示 这样不太安全 就需要用到相关的脱敏工具进行脱敏之后再显示 总结部分脱敏工具 package com li info import org apache commons lang3 StringUtils
  • pycharm的setting里面找不到我们用conda配置好的环境

    原因 电脑里面有多个python版本导致 我们目前添加的python并不是我们anaconda中python的版本 解决办法 在pycharm里面 使用setting里面的Add选项里 可以找到我们配置的所有环境 然后添加进去 具体如下图所
  • sql server将字符串转换为 uniqueidentifier 时失败

    sql server将字符串转换为 uniqueidentifier 时失败 sql server查询中出现 将字符串转换为 uniqueidentifier 时失败异常 原因为id设置为uniqueidentifier 字段 在where
  • shell day3

    思维导图

随机推荐

  • Unity错误记录——UIDocument重新激活后,脚本内编写的UI交互失效

    如题 本人使用UITookit编写了一个UXML的UI界面后 将其搭载到了一个UIDocument对象上 并将该对象作为UI相机的子对象以实现UI界面与相机绑定 在为UIDocument编写交互用的C 时 采用了下面的错误做法 导致UIDo
  • 正确获取硬盘序列号源码

    参考 http www winsim com diskid32 diskid32 cpp diskid32 cpp for displaying the details of hard drives in a command window
  • BES2300x笔记----TWS组对与蓝牙配对

    https me csdn net zhanghuaishu0 一 前言 看到有 道友 在评论区留言 对TWS组对 BT配对以及回连流程部分很迷糊 那这第二篇我们就来说说BES平台的相关流程和接口 PS 蓝牙基础部分就不再赘述了 网上有很多
  • jdbc mysql 重连_mysql重连的问题

    应用在长时间不连mysql后会与mysql断开 再次链接mysql时会报无法连接数据库的异常 所以连接的配置需要稍微改一下 factory org apache naming factory BeanFactory driverClass
  • LABVIEW连接MySQL进行读写更新查询操作并仿真

    相关软件的准备 欢迎访问我的小站 我的软件环境是LabVIEW 2018 32位 的 这个很重要 因为不同位数的labview需要安装不同位数的Connector odbc 还需要安装visio的运行环境 这个需要提前准备 Mysql的安装
  • 华为数字化转型之道 平台篇 第十三章 变革治理体系

    第十三章 变革治理体系 约翰 科特在 领导变革 一书中说 变革的领导团队既需要管理能力 也需要领导能力 他们必须结合起来 前面我们也谈到 数字化转型不仅是技术的创新 更是一项系统工程和企业真正的变革 企业要转型成功 既需要各个组织的积极参与
  • python---matplotlib详细教程(完结)

    文章每个图都带有案例 欢迎访问 目录 如何选择合适的图表 绘制简单的折线图 图表常用设置 颜色设置 线条样式和标记样式 画布设置 设置坐标轴标题 plt rcParams font sans serif SimHei 解决缺失字体 设置坐标
  • 【三】springboot整合token(超详细)

    springboot篇章整体栏目 一 springboot整合swagger 超详细 二 springboot整合swagger 自定义 超详细 三 springboot整合token 超详细 四 springboot整合mybatis p
  • 【华为OD机试真题 python】组装新的数组【2023 Q1

    题目描述 组装新的数组 给你一个整数M和数组N N中的元素为连续整数 要求根据N中的元素组装成新的数组R 组装规则 1 R中元素总和加起来等于M 2 R中的元素可以从N中重复选取 3 R中的元素最多只能有1个不在N中 且比N中的数字都要小
  • python格式化输出,format,数据类型转换。

    输出 计算机给用户输出的内容 是一个由里到外的一个过程 例如python语言中的print函数 输入 则相反 例如input函数 一 输出有普通的输出 也有格式化输出 普通输出 类似于 print hello word 这样直接打印 格式化
  • 为高尔夫比赛砍树

    为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树 树林由一个 m x n 的矩阵表示 在这个矩阵中 0 表示障碍 无法触碰 1 表示地面 可以行走 比 1 大的数 表示有树的单元格 可以行走 数值表示树的高度 每一步 你都可以向上
  • 系统篇: squashfs 文件系统

    一 squashfs简介 Squashfs是一套基于Linux内核使用的压缩只读文件系统 该文件系统能够压缩系统内的文档 inode以及目录 文件最大支持2 64字节 特点 数据 data 节点 inode 和目录 directories
  • 虚幻C++ http请求

    直接上代码 Fill out your copyright notice in the Description page of Project Settings pragma once include CoreMinimal h inclu
  • 测试岗?从功能测试进阶自动化测试开发,测试之路不迷茫...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • Mock框架应用(四)-Mock 重定向请求

    例一 先新建json配置文件重定向到www baidu com 启动mock服务 description 实现重定向的请求 request uri redirect redirectTo https www baidu com respon
  • Go并发(goroutine)及并发常用模型的实现

    前言 Go 语言最吸引人的地方是它内建的并发支持 作为天然支持高并发的语言 写并发比java和python要简单方便的多 在并发编程中 对共享资源的正确访问需要精确的控制 在目前的绝大多数语言中 都是通过加锁等线程同步方案来解决这一困难问题
  • 疯壳-MTK智能电话手表开发整板测试

    目录 内容简介 3 第一节 开机 4 第二节 绑定 5 第三节 功能测试 9 3 1 屏幕测试 9 3 2 SIM通信测试 11 3 3 SIM 测试 12 3 4 GPS测试 14 3 5 手表对时 18 官网地址 https www f
  • 1449 砝码称重 51NOD

    1449 砝码称重 题目来源 CodeForces 基准时间限制 1 秒 空间限制 131072 KB 分值 40 难度 4级算法题 现在有好多种砝码 他们的重量是 w0 w1 w2 每种各一个 问用这些砝码能不能表示一个重量为m的东西 样
  • flink中idea配置pom.xml

  • JS之预解析

    javascript 的预解析 个人理解 就是js代码在执行之前 会在相应的执行环境中 预先把 一些东西解析到内存 如果理解错误 请多多指正 一 那究竟预先解析哪些东西那 答 预先解析 function 和 var 二 还有就是预解析的顺序