JS基本概念
单线程
GUI线程与JS线程互斥,大量数据运算可能导致页面更新不及时或者卡顿。
动态、弱类型语言
声明变量无需指定变量类型。
面向对象、函数式
函数式:只用"表达式",不用"语句",没有"副作用"。
面向对象:原型,继承,封装。
解释类语言、JIT
JS不是纯粹解释类语言,变量提升可以体现其编译过程。
安全
执行需要附属环境(浏览器),不能访问本地文件系统等,安全性高
性能差
边编译边执行,性能较差。
JS数据类型
基本数据类型:String、Number、Boolean、Null、Undefined、Symbol(ES6)、BigInt. 赋值是赋值地址,原始值可以被改变。
引用数据类型:Object【Object是个大类,function函数、array数组、date日期...等都归属于Object。赋值仅是赋值,原始值不可改变。
JS作用域
变量的可访问性和可见性。
JS是静态作用域,通过它就能预测代码在执行过程中如何查找标识符。
JS拥有全局作用域、函数作用域和后来增加的块级作用域。
JS变量提升
只针对var和函数。
对于var:在变量被声明前输出变量,会输出undefined而不是报错。
如:console.log(aa);
Var aa=”hello”;
输出结果为:undefined.
对于函数:函数定义会被提升,但将函数赋值给变量并在赋值之前使用函数会报错。
如:showName()
Function showName(){
console.log(‘hello’);
}
输出结果为:hello
但 func()
var func=showName;
Function showName(){
console.log(‘hello’);
}
输出结果为: error.
JS怎么执行的
当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文(execution context简称EC ) ”也叫执行环境。
全局执行上下文:代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份。
函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出。
执行上下文步骤:
1. 绑定this
2. 创建词法环境
3. 创建变量环境
变量环境放var,词法环境放let和const。
Outer指向外部变量环境的一个指针。从上一个执行上下文找(找不到就继续往上翻找)。
栈外的上下文会无效。