js 笔记 | 青训营笔记

47 阅读2分钟

JS的基本概念

image-20230505100747774

  • js 线程和 GUI 线程是互斥的
  • 动态、弱类型语言
  • 面向对象、函数式
  • 解释类语言(?)、JIT
  • 安全(不能访问底层系统)、性能差(不如编译语言)

数据类型

image-20230505101210855

一个结论:在js 中基础数据类型的值被创建了就不可以被改变

 // 一个结论:在js 中基础数据类型的值被创建了就不可以被改变了,但是引用类型的值可以被改变
 let a = [1, 2];
 a.push(3);
 ​
 let b = "strstr";
 b.slice(02);
 ​
 console.log("a,b->", ab); // a,b-> [ 1, 2, 3 ] strstr

作用域-变量的可访问性和可见性

静态作用域,通过它就能够预测代码在执行过程中如何查找标识符

  • 全局作用域
  • 函数作用域
  • 块级作用域

变量提升

var有变量提升

let、const没有变量提升,提前访问会报错

function函数可以先调用再定义

赋值给变量的函数无法提前调用

JS是怎么执行的

image-20230505103902282

JIT:相同的代码多次执行-直接转换为机器码

执行上下文

  • 全局
  • 函数
  • eval

全局执行上下文:代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份

函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出

创建执行上下文的时候做了什么?

  1. 绑定 this(Outer)- 往外找形成作用域链
  2. 创建词法环境
  3. 创建变量环境

执行栈--esp一个记录当前执行状态的指针(控制垃圾回收)

进阶知识点

闭包(本质是没有被回收的对象)

 function showName() {
     const name = "Lucy";
     const dep = "前端";
 ​
     return function () { // 返回 function 的时候形成了闭包
         console.log(name, dep);
         return name;
    }
 }
 ​
 const fn = showName();
 console.log('fn()->'fn())
 ​

this

垃圾回收

image-20230505110012430

事件循环