1、JavaScript基本数据类型
* 基本(值)类型
- String : 任意字符串
- Number : 任意数字
- Boolean : true/false
- Undefined : undefined
- Nul l: null
* 对象(引用)类型
- Object : 任意对象
- Function : 一种特别的对象(可以执行)
- Array : 一种特别的对象(数值下标,内部数据是有序的)
* 判断数据类型
- typeof : 返回数据类型的字符串表达
- instanceof (实例) : 判断对象的具体类型
- ===
2、对象
* 什么是对象
用来保存多个数据的容器
* 为什么要用对象
便于统一管理多个数据
* 对象的组成
属性:属性名(字符串)和属性值(任意)组成
方法:一种特别的属性(属性值是函数)
3、函数
* 什么是函数
实现特定功能的n条语句的封装体
* 为什么要用函数
提高代码复用性
便于阅读交流
* 回调函数
①自己定义的 ②不用手动调 ③最终执行的 满足这三点的都是回调函数
常见的回调函数:
a.dom事件回调函数
b.定时器回调函数
c.ajax请求回调函数
d.生命周期回调函数
* IIFE(立即执行)函数
作用:①隐藏实现 ②不会污染外部(全局)命名空间 ③用来编写JS模块
* 函数中的this变量
- 任何函数本质上都是通过某个对象来调用的,如果没有指定则是window对象
- 所以函数内部都有一个变量this
- this的值是调用函数的当前对象
4、函数的prototype
每个函数都有一个prototype属性(显示原型),这个属性默认指向一个Object空对象(即称为原型对象)。而每个原型对象中又有一个constructor属性,此属性指向函数对象

给原型对象添加属性(一般是方法),函数的所以实例对象自动拥有原型对象中的方法
实例化对象中的属性是__proto__(隐式原型),也指向原型对象
* 原型链
(注:其实Object空对象 是 Object函数对象的实例)
访问一个对象的属性时,先在自身属性中查找,找到返回;找不到就沿着__proto__这条链向上查找,找到返回;如果还找不到,则返回undefined
5、变量提升与函数提升
函数提升:只要定义了一个函数,无论将函数写在哪里,系统总会将这个函数放置在最前面,则无论在哪个位置都可以调用这个函数
变量提升:给一个变量声明+赋值,系统只会将声明放在最前面,而赋值依旧在原来的位置

6、执行上下文类型和执行上下文栈
类型:全局执行上下文和函数执行上下文
全局执行上下文:任何不再函数内部的都是全局执行上下文,首先会创建一个全局的window对象,并且设置this值等于window对象,一个程序中只有一个全局执行上下文
函数执行上下文:当一个函数被调用时,就会为该函数创建一个新的执行上下文,函数执行上下文可以有任意多个
栈管理:JavaScript引擎使用执行上下文栈来管理执行上下文
7、作用域
作用域的个数是 定义函数的个数加上全局作用域。作用域的作用是隔离变量。
作用域是分层的,内层作用域可以访问外层作用域,反之不行。在当前作用域查找所需变量,如果找不到就去父级作用域查找,直到访问window对象就终止,这一层层就是作用域链。
作用域是静态的,只要函数定义好了就一直存在,且不再变化,执行上下文是动态的,调用函数时创建,函数调用结束后就被释放。
8、闭包
闭包是指有权访问另一函数作用域中变量的函数,创建闭包最常见的方式就是在一个函数内创建另一个函数,内部函数可以访问当前函数的局部变量。

函数B就是闭包,需要注意的是,必须先调用A,B才可以访问到A里面的变量

上面这个例子中,调用 f() ,会直接进入函数 fn2, 因为 fn1 的返回值是 fn2。
调用几次外部函数就产生几次闭包,故上述例子只产生一个闭包。释放闭包: f = null
闭包的作用:在函数外部可以操作函数内部的变量/函数;且函数内部的变量在函数执行完毕后,仍存活在内存中(延长了局部变量的生命周期)
闭包的缺点:函数执行完后,函数内的局部变量没有释放,则其占用内存的时间会变长,容易造成内存泄露
(补充:
内存溢出:程序运行需要的内存超过了剩余内存,就会抛出内存溢出的错误
内存泄露:占用的内存没有及时释放导致
)