深入理解JS | 青训营笔记

59 阅读3分钟

深入理解JS

  • 基本概念

1.基于c的语法;

2.基于java的数据类型和内存管理;

3.函数为一等公民;

4.基于原型的继承机制;

5.单线程:

Screen Shot 2023-04-28 at 15.29.44.png

如图所示,需要注意的是,js线程与GUI线程是互斥的,因为js线程会改变DOM,使得GUI线程渲染出的不是最新的页面,所以GUI线程需要等待js线程结束之后再进行。

6.动态语言(弱类型)

//弱类型,运行时确定
const exm1="halo";
//与静态语言(强类型)对比,后者是编译时确定
string exm2="halo";

7.面向对象,函数式

两者在jvascript中可以混合使用

8.解释性语言,JIT

js并不是单纯的解释性语言

9.安全,性能差(解释性语言)

安全 是因为 运行需要依赖特定环境,如 浏览器。

10.数据类型

Screen Shot 2023-04-28 at 15.43.43.png

11.作用域

js为静态作用域

所谓静态作用域,指的是函数中变量会优先寻找函数内部有无相关定义,若无,则寻找 函数定义处 的上一级,也就是说,与函数调用的地方无关。

//exm
var a = 1
function fn1(){
    function fn2(){
        console.log(a)
    }
    function fn3(){
        var a = 4
        fn2()
    }
    var a = 2
    return fn3
}
var fn = fn1()
fn()
//结果为1

当然,事实上,从函数式编程的角度来说,函数内部要用到什么变量,都应该作为参数传入。

12.JS的变量提升

Screen Shot 2023-04-28 at 16.08.01.png

//虽然但是,var提升变量作用域不代表会提前知道其定义
console.log(comp)
var comp="halo"
//打印结果:undefined 未报错
//但是function可以精准调用。

从变量提升,也可以看出,js也是有编译过程的,并非纯解释性语言。

13.js的执行过程

一.

Screen Shot 2023-04-28 at 16.31.24.png

注意

二.

JS引擎解析到可执行代码时,会做一些准备工作。 这个准备工作,就叫做 执行上下文,也叫做执行环境。包含变量环境和词法环境。

执行上下文大致两种

1.全局执行上下文:

在初始时就被创建,被压入 执行栈 底部,每个生命周期只有一份。

2.函数执行上下文

在函数被执行,即被调用时,会产生函数执行上下文,当结束执行时,该执行环境被从栈顶弹出。

tip1:执行栈,即调用栈,存放执行环境

tip2:词法环境:基于ECMAscript的词法嵌套结构定义标识符,变量,函数的关联

tip3:变量环境:只存储var变量的绑定。(let,const变量的绑定在词法环境)

tip4:outer:指向外部变量的一个指针

注意,外部 并非 前一个,建议自己画一个栈来理解一下

最后,异步与同步在栈中的进入弹出方式是不一样的。 同步的会在压入栈后弹出,再压入另一个。

  • 对于基础变量,存在执行环境即可,对于对象,其值存放在堆空间,执行环境中存放的是堆空间相对应的地址。

  • ESP-记录当前执行状态的指针

当执行完一个后,ESP指向下一个,执行完的这个构成了栈中的垃圾空间,以后再往栈中压入东西时,会覆盖该区域,这就是 栈的垃圾回收。

this

1.对于普通函数,this指向window

2.对于对象,this指向该对象

3.new 可以创建临时对象,将this指向临时对象,再执行构造函数,再返回临时对象。

function show()
{
this.sen="halo"
console.log(this.sen)
}
const t=new show()
console.log(t.sen)
//打印结果:halo
//        halo
//因为有构造函数,会打印两次

垃圾回收

1.栈 上面ESP部分

2.堆 分为老生代,新生代

Screen Shot 2023-04-28 at 18.21.54.png

事件循环