JavaScript核心原理三部曲: 《作用域链:从编译到执行的完整生命周期》

257 阅读2分钟

js 引擎 V8:

V8 是 Google 开源的高性能 JavaScript 和 WebAssembly 引擎,用 C++ 编写。它是现代 JavaScript 运行的核心技术之一,主要应用场景包括:

1.核心功能与作用

执行 JavaScript 代码 将人类可读的 JS 代码转换为机器可执行的指令。

2.内存管理

通过垃圾回收机制自动分配/释放内存,避免内存泄漏。

3.即时编译(JIT)

它是一个庞大的函数,提供了执行js代码的能力,本质是 JavaScript 的“操作系统”,即能读懂 js 的运行环境

1.浏览器

2.node

v8 执行 js 代码的过程
1.分词/词法分析 :代码块会被以字符串的方式读取分解
var a=5;
//var  词法单元
//
//a
//=
//5
//;
2.解析/语法分析 ---得到一个抽象语法树
3.代码生成
var a=5;

生成的代码和原来一样,那有什么不同呢?有什么作用呢?让我们看下面这段代码

console.log(a)
var a=2

以上这段代码放在其他语言里面会报a未声明 ,但是在v8引擎下,执行打印时,a是已经是声明但未赋值的 经过v8生成的代码如下:

var a
console.log(a)
a=2//a声明提升

至于为什么生成代码长这样,那就有关词法分析规则,这涉及代码底层规则,如果感兴趣的可以自行查找

作用域 :存放变量的值,并能在之后对这个值进行访问和修改

1.全局作用域 (整个js文件)

2.函数作用域

var a=10
console.log(a)//全局查找 a
function fn(b){
c=9
console.log(a+b)
}
fn(2)
console.log(c)//9

这里需要注意的是如果不用关键字声明变量的话,这个变量相当于全局变量 3.块级作用域

let+{}
if(true)
{
  let a=1
}
console.log(a)//报错a未定义声明

作用域查找规则

1.现在当前作用域中查找 ,找到就返回,找不到再在全局作用域/外层作用域查找 2.只能从内到外查找,不可以从外到内查找

let const var 的区别

1.let,const 声明的变量不存在声明提升

console.log(a)
let a=2//打印时报错 a未声明

2.let,const 声明的变量不能重复声明

var a=4
var a=5
console.log(a)//Es6以后使用let const 防止重复声明

3.var 声明的全局变量会挂载到 window

4.const 声明的变量,值不能修改

5.let 变量+{}只有let声明的变量在块级作用域中

if(true)
{
  let a=1
  var b=2
}
console.log(a)//报错a未定义声明
console.log(b)//2