JS的基本概念
- js 线程和 GUI 线程是互斥的
- 动态、弱类型语言
- 面向对象、函数式
- 解释类语言(?)、JIT
- 安全(不能访问底层系统)、性能差(不如编译语言)
数据类型
一个结论:在js 中基础数据类型的值被创建了就不可以被改变
// 一个结论:在js 中基础数据类型的值被创建了就不可以被改变了,但是引用类型的值可以被改变
let a = [1, 2];
a.push(3);
let b = "strstr";
b.slice(0, 2);
console.log("a,b->", a, b); // a,b-> [ 1, 2, 3 ] strstr
作用域-变量的可访问性和可见性
静态作用域,通过它就能够预测代码在执行过程中如何查找标识符
- 全局作用域
- 函数作用域
- 块级作用域
变量提升
var有变量提升
let、const没有变量提升,提前访问会报错
function函数可以先调用再定义
赋值给变量的函数无法提前调用
JS是怎么执行的
JIT:相同的代码多次执行-直接转换为机器码
执行上下文
- 全局
- 函数
- eval
全局执行上下文:代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份
函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
创建执行上下文的时候做了什么?
- 绑定 this(Outer)- 往外找形成作用域链
- 创建词法环境
- 创建变量环境
执行栈--esp一个记录当前执行状态的指针(控制垃圾回收)
进阶知识点
闭包(本质是没有被回收的对象)
function showName() {
const name = "Lucy";
const dep = "前端";
return function () { // 返回 function 的时候形成了闭包
console.log(name, dep);
return name;
}
}
const fn = showName();
console.log('fn()->', fn())