js:什么是编译时和运行时

news2024/10/5 23:29:32

编译时

源代码编译为机器可执行的二进制码。

编译过程中一般会识别你代码中的语法错误等问题,这个错误就叫编译时错误,做的一些检查也叫做编译时类型检查或者静态类型检查,因为静态就意味着代码还没有放到内存里去运行,只是把代码当做静态文本来扫描。

运行时

编译时代码还在硬盘中,而运行时代码跑起来了,已经运行在内存中去了。

举例说明

java

对于编译型语言 java 来说:

java 的代码就是被编译为 .class 文件才能运行,这个编译过程就是编译时,运行 .class 文件就是运行时。

JavaScript

对于解释型语言 js 来说:

我们知道,在浏览器中 js 的解释器是 jscore、v8 等,我们在浏览器直接输入一些代码,就可以执行,并没有经过编译成某个文件。
所以我的理解是解释型语言是没有编译时,只有运行时。(当然有些人说 js 的变量提升等是预编译,但是我认为也不是传统意义上的编译时)

那我们常说的 js 编译是什么呢?
现代前端开发,我们都是使用 react、vue、webpack 等工具,其实就是把这些框架代码编译成了 js 代码,那么编译时其实是指的,webpack 等工具把 react、vue 编译为 js 的过程。运行时自然不用说,就是浏览器解释 js 代码的过程。

js运行时

把树型结构的数据对象传入 render 函数,然后 render 函数渲染成 DOM 元素。

// 清空屏幕,确保网站有个 id="app" 的 dom
document.getElementById('app').innerHTML = ''
// 渲染 dom
function render (node, root) {
  const el = document.createElement(node.tag)
  if (typeof node.children === 'string') {
    const text = document.createTextNode(node.children)
    el.appendChild(text)
  }
  if (Array.isArray(node.children)) {
    node.children.forEach(child => render(child, el)) // 递归地处理节点的渲染
  }
  root.appendChild(el)
}

const node = {
  tag: 'div', // tag代表标签名称
  children: [ // children可以是一个数组,代表子节点
    {
      tag: 'h1',
      children: 'hello' // children也可以是一段文本,代表文本子节点
    }
  ]
}

const app = document.getElementById('app')
render(node, app)

在这里插入图片描述
这种通过 js 的方式生成页面就是运行时框架,可以看到书写非常的困难。

js编译时

我们平常写 vue 是不是这样写的

<template>
  <div>
    <h1>hello</h1>
  </div>
</template>

假设上面的代码编译为下面的代码,直接在浏览器上可以运行

const div = document.createElement('div')
const h1 = document.createElement('h1')
h1.innerText = 'hello'
div.appendChild(h1)
document.body.appendChild(div)

但是很显然,vue 不是这样做的,我们可以在这个 在线网站 测试一下。
在这里插入图片描述
这段编译出来的代码,引入了一些乱七八糟的函数,传了一些乱七八糟的参数,很显然,这样的代码不是单纯的操作 DOM 的原生 JS,还包含了创建 VNode 、diff等操作。

由此,我们可以得出结论,Vue 是一个运行时 + 编译时的框架,在编译时把浏览器看不懂的代码转化为 JS 代码,在运行时创建虚拟 DOM,做 diff 对比,更新真实 DOM 等等操作。

举一些实例,比如 jQuery,就是一个运行时框架;Vue 或者 React,就比较折中,是运行时 + 编译时框架;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九.STM32F030C8T6 MCU开发之电源掉电数据保存案例

九.STM32F030C8T6 MCU开发之电源掉电数据保存案例 0.总体功能概述 使用STD库–en.stm32f0_stdperiph_lib_v1.6.0。 1.掉电数据保存背景 掉电保存数据的时间内 电源稳定。也就是数据保存时间要尽量短,电源稳定要尽量长。 第一种,采用备用电池的方法来实现,增加了电池和更…

DFS搜索和输出所有路径

文章目录1、DFS搜所有路径2、用栈记录和输出路径3、例题3.1 C代码3.2 Python代码4、真题4.1 C代码4.2 Python代码2022.12将出版蓝桥杯大赛用书《蓝桥杯大赛-程序设计竞赛专题挑战教程》&#xff0c;作者&#xff1a;蓝桥杯组委会、罗勇军。   这本书解析了蓝桥杯大赛的常见考…

PLC学习笔记(二):PLC结构(1)

目录&#xff1a; PLC学习笔记&#xff08;一&#xff09;&#xff1a;概述 PLC学习笔记&#xff08;二&#xff09;&#xff1a;PLC结构&#xff08;1&#xff09; PLC学习笔记&#xff08;三&#xff09;&#xff1a;PLC结构&#xff08;2&#xff09; &#x1f981;&…

嵌入式FreeRTOS学习十一,深入理解任务调度机制

一.任务调度机制 可抢占&#xff1a;高优先级的任务先运行时间片轮转&#xff1a;同优先级的任务轮流执行空闲任务礼让&#xff1a;如果有同是优先级为0的其他就绪任务&#xff0c;空闲任务主动放弃一次运行机会函数调用vTaskDelay( xDelay5ms )可以主动放弃任务执行&#xff…

大学物理·第8章【电磁感应、电磁场】

from now on, 以后的篇幅我都不会写太多了。因为效果也不一定有&#xff0c;还很浪费时间。 感应电动势 那个奥特曼变身器的符号是 磁链 看看划线公式即可 动生电动势&#xff1a;dξ vB dl 例 如果&#xff0c;到时候复习的时候觉得简单的话&#xff0c;就删掉好了 自感、互…

【HTML5】登录页面制作简易版

刚开始学习Java。文件的命名&#xff0c;讲道理应该以英文为主&#xff0c;但是英语又不好&#xff0c;所以只好用拼音&#xff0c;最痛苦的应该算是那些英语又不好&#xff0c;又想秀一下的程序员&#xff0c;一半英语一半拼音&#xff0c;如mainFangFa~~~你说看了糟心不糟心。…

山东大学线性代数-1-矩阵-1

目录 1.2 几种特殊的矩阵 1.2.1 方阵 1.2.2 零矩阵 1.2.3 对角矩阵 1.2.4 单位矩阵 1.2.5 数量矩阵 1.2.6 三角阵 1.2.7 梯形阵 1.3 矩阵的运算&#xff08;一&#xff09; 1.3.1 相等 1.3.2 加、减法 1.3.3 数乘 1.3.4 矩阵的乘法 1.4 矩阵的运算&#xff08;二&#x…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.18 查询文档

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.18 查询文档4.18.1 查询文档4.18.2 小结4.18.3 总…

山东大学线性代数-3-n维向量

目录 3.1 n维向量及其线性运算 3.1.1 n维向量的概念 3.1.2 向量的相等 3.1.3 n维向量的线性运算 3.1.4 线性组合 3.1.5 向量组的等价 3.2 向量组的线性相关性 3.2.1 线性相关性的定义 3.2.2 特殊情形的线性相关性 3.3 相关性的判定及有关重要结论 3.3.1 线性相关与…

[MQ] SpringBoot使用直连交换机Direct Exchange

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

Bootstrap-栅格实例(二)

栅格实例 进入官网 选择3.0的中文文档&#xff1a; 选择组件&#xff1a; 选择缩放图&#xff1a; 选择这个&#xff0c;复制代码&#xff1a; 把代码拷贝到&#xff0c;新创建的模板固定container里面&#xff1a; 删除靠过来的多余的row&#xff1a; 修改div的calss&…

【信息奥赛实训】Week1——STL 与基础数据结构专题训练

【信息奥赛实训】Week1-Lab-STL 作者&#xff5c;Rickyの水果摊 时间&#xff5c;2022年11月20日 实训概要 实训专题 STL 与基础数据结构专题训练 实训目的 掌握STL常用的算法、容器、容器适配器的使用方法。能够利用STL的算法、容器、容器适配器求解问题。 题目列表 A&…

HTML小游戏9 —— 潜行游戏《侠盗罗宾汉》(附完整源码)

&#x1f482; 网站推荐:【神级源码资源网】【摸鱼小游戏】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且实用的计算机相关知…

紫外线杀菌器

一、概述 紫外线杀菌器是利用波长为225-275nm的紫外线对微生物的杀灭而使水中菌类得以净化。当水流经消毒仪时&#xff0c;高强度杀菌作用的紫外线即将水中细菌杀灭。本产品彻底解决了饮用水二次污染细菌超标问题&#xff0c;同时也适用于饮料、食品、游泳池等用水的消毒处理。…

Linux基本指令——综合操作

bc指令bc指令其实就是Linux下的计算器Ctrl c退出也可以通过管道进行输出。bc命令并不常用&#xff0c;主要是见见。uname -r指令语法&#xff1a;uname [选项]作用&#xff1a;uname可以用来获取电脑或者操作系统的相关信息。选项&#xff1a;-a或–all 详细输出所有信息&…

ConsulManager安装

地址 地址&#xff1a; https://github.com/starsliao/ConsulManager使用yum部署consul 在这里可以直接使用yum安装部署consul这个组件 # 使用yum部署consul yum install -y yum-utils yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.re…

(续)SSM整合之springmvc笔记(RESTful之RESTful案例)(P148-153)

目录 RESTful案例 一 . 准备工作 1 . 准备实体类 2 .准备dao模拟数据 3. 创建控制层EmployeeController 二 功能清单 三 . 具体功能&#xff1a;查询所有员工数据 ①控制器方法 ②创建employee_list.html RESTful案例 一 . 准备工作 和传统CRUD 一样&#xff0c;…

【前沿技术RPA】 一文了解UiPath 通过Invoke Method 和 Invoke Code增强自动化功能

&#x1f40b;作者简介&#xff1a;博主是一位.Net开发者&#xff0c;同时也是RPA和低代码平台的践行者。 &#x1f42c;个人主页&#xff1a;会敲键盘的肘子 &#x1f430;系列专栏&#xff1a;UiPath &#x1f980;专栏简介&#xff1a;UiPath在传统的RPA&#xff08;Robotic…

[附源码]Python计算机毕业设计_旅游系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

多表操作(外键)

多表操作 外键 外键&#xff08;foreign key&#xff09;&#xff1a; 外键为某个表中的一列&#xff0c;它包含另一个表的主键值&#xff0c;定义了两个表之间的关系。 主表&#xff08;父表&#xff09;&#xff1a;对于两个具有关联关系的表而言&#xff0c;相关联字段中…