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