一、变量的内存分配
基本数据类型:number、string、boolean、undefined、null、symbol
引用数据类型:object(array object function)
基本数据类型,都是存放在栈内存中,栈内存空间大小是的
引用数据类型,会把"地址"存放在栈内存中,"内容"存放在堆内存中,这个地址指向内容
二、作用域
定义:JS中,所有标识符可以访问的"范围" (标识符:使用var声明的变量
、使用function声明的函数名
,形参
,统称为标识符)
作用域分类:
1. 全局
2. 局部
3. 块级(let、const)ES5没有块级作用域
注意:
(1)作用域是函数声明的位置决定(写代码的时候,这个代码的嵌套关系,就已经把作用域确定了)
函数在哪里调用,如何调用,都不会被改变
(2)ES5中,只有函数才能创建作用域
作用域链:
先自己的作用域 => 父 => 逐级向上 => window (如果window没有,就不存在)
三、编译原理
- JS代码执行,分为两大阶段
“预编译”
和“解释执行”
- 在
“预编译”
阶段,会把使用var声明的变量
和使用function声明的函数
提升到“当前作用域”
顶部 - var声明的变量,
只提升
声明,赋值保留在原位
。提升以后,给一个初始值(初始值为undefined) - 如果函数和变量同名,
提升的时候
,函数定义的优先级高(以函数为准) ES6的let和const,定义后,才可以使用
四、闭包
定义:闭包是指有权访问另外一个函数作用域中的变量的函数(红宝书page178)
理解:函数跨作用域
(里访问外)访问变量,形成闭包
,闭包是一种“作用域”
的体现。常见的闭包,是父函数嵌套子函数,子函数可以访问父函数的变量,把子函数返回或挂在全局window
优点:私有化变量,避免全局污染
缺点:变量会常驻内存,延迟或不会被JS的垃圾回收机制回收,可能造成比较大的内存开销甚至内存泄漏。
五、面向对象与面向过程
面向过程(POP):所有过程亲力亲为,对细节把控比较清晰 --小兵思维
面向对象(OOP):通过调用各个对象的方法,完成功能,对全局把控清晰 – 将军思维
注意:面向过程和面向对象都是编程的思想
六、原型
- 每一个函数(通常指构造函数),都有一个属性
prototype
,就是原型(显示原型) - prototype的值是一个普通的对象,默认有两个属性
constructor
、__proto__
- 原型prototype上的
所有属性和方法
,被所有创建出来的实例对象共享
(继承) - 原型prototype,有一个属性constructor,指向构造函数本身
- 每一个实例对象,都有一个属性__proto__(隐式原型),指向自己构造函数的显示原型(prototype)
- JS对象方法查找规则:先自己 => 往原型链上找 => 直到顶层 null
七、原型链
- 构造函数prototype(显示原型),也是一个普通对象,也有__proto__(隐式原型),指向上一级构造函数的显示原型prototype
- 逐级往上,直到Object.prototype,Object.prototype也有__pooto__,指向 null