前端语言串讲 | 青训营笔记

150 阅读4分钟

image.png

本次课概念性知识较多,老师先是简要介绍了前端三件套(HTML、CSS、Javascript)的用途、发展史及简单语法,随后重点针对HTML5进行了深层次的拓展。此笔记旨在记录上课中遇到的疑惑及认为值得牢记的知识点。

HTML&CSS&Javascript三者间的关系

语言用途
HTML创建网页结构
CSS定义网页的外观和样式
Javascript实现网页的交互和动态效果

老师上课时将这三种语言用打比方的方式介绍给我们:

  • HTML——骨骼
  • CSS——皮囊
  • Javascript——肌肉(让身体具有了运动能力)

var&&let&const

语言用途
varES5 中声明变量的关键字。它可以在函数内部和全局范围内声明变量。var 声明的变量存在变量提升,即变量可以在声明之前使用,但是其值为 undefined
letES6 中引入的关键字,用于声明块级作用域变量。与 var 不同的是,let 声明的变量不存在变量提升,不能在声明之前使用。同时,同一作用域内不能重复声明同名变量。
constES6 中引入的关键字,用于声明块级作用域的常量。与 let 不同,const 声明的变量必须在声明时初始化,而且不能再次赋值。

下面用代码阐述三者间的区别:

// var 
var x = 10;
if (true) { 
    var x = 20; 
} 
console.log(x); // 输出 20,因为 var 声明的变量在整个函数或全局范围内都是可见的 

// let
let y = 10; 
if (true) {
    let y = 20; 
} 
console.log(y); // 输出 10,因为 let 声明的变量只在当前块级作用域内有效 

// const
const z = 10; 
if (true) { 
    const z = 20; // 编译错误,常量不能重新赋值
} 
console.log(z); // 输出 10,因为 const 声明的变量是常量,不可修改

V8 JavaScript引擎

V8是由Google开发的高性能Javascript引擎,用于Chrome浏览器和Node.js等平台。

image.png

  • Parser(解析器):用于将源代码转换为计算机可以理解的形式
  • AST(抽象语法树):一种用于表示程序代码语法结构的树状结构
  • Ignition(字节码解释器):将字节码转换为机器码,并负责执行Javascript代码。它采用了延迟编译的策略,还支持代码热加载
  • Turbofan(优化编译器):可以根据代码的实际运行情况来进行优化,并且支持即时编译(JIT)技术,即在代码运行时即时编译和优化代码,以提高执行速度

Turbofan运行时如果发现数据类型不对,会反过来让Ignition重新优化兼容类型的代码,因此尽量不要反复改JS变量的类型

JavaScript的事件机制

首先你需要知道

JavaScript 是一门单线程语言,即在任何时刻只有一个任务(代码块)在执行。如果任务中包含了一些耗时的操作,比如网络请求或者计算密集型的任务,这可能会导致页面出现卡顿或者失去响应的情况。

因此,我们需要进行异步编程,将任务分为多个部分,并将这些部分分别添加到事件队列中,以便异步执行。这就形成了事件机制

JavaScript 中的事件机制由事件队列、事件循环和回调函数组成。事件队列用于存储待处理的事件,事件循环用于监控事件队列并将事件推入到调用栈中执行,回调函数则是在事件处理完成时被执行的函数。

可见,事件队列是事件机制的一个核心元素,它分为宏任务队列和微任务队列

  • 宏任务:包括定时器事件(setTimeout、setInterval 等)、UI 事件、网络请求事件等。一般浏览器默认情况下执行的代码大多都是宏任务。宏任务在执行时会产生比较显著的延迟
  • 微任务:包括 Promise、process.nextTick、MutationObserver 等。这一类任务响应时间相对较短
  • 处理优先级:微任务>宏任务

看个例子:

console.log('Start');

setTimeout(() => {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(() => {
  console.log('Promise');
});

console.log('End');

输出结果为:

image.png

让我们分析一下其执行过程:

  1. 在JavaScript中,代码执行是同步的,意味着代码将按照顺序执行,从上到下逐行执行。在这个过程中,console.log('Start')console.log('End') 都是同步执行的语句,因此它们将首先被执行并输出,而setTimeout和Promise语句块被加入事件队列
  2. 由于Promise的回调函数是微任务,console.log('Promise') 将首先被输出
  3. 尽管setTimeout 的延迟时间为 0,但是它仍然是一个宏任务,因此其回调函数将在微任务Promise的回调函数执行后执行