高级JS(堆、栈、作用域、闭包、原型、this指向)

一、变量的内存分配

基本数据类型:number、string、boolean、undefined、null、symbol

引用数据类型:object(array object function)

基本数据类型,都是存放在栈内存中,栈内存空间大小是的
引用数据类型,会把"地址"存放在栈内存中,"内容"存放在堆内存中,这个地址指向内容
在这里插入图片描述

二、作用域

定义:JS中,所有标识符可以访问的"范围" (标识符:使用var声明的变量、使用function声明的函数名形参,统称为标识符)
作用域分类:
1. 全局
2. 局部
3. 块级(let、const)ES5没有块级作用域
注意:

(1)作用域是函数声明的位置决定(写代码的时候,这个代码的嵌套关系,就已经把作用域确定了)函数在哪里调用,如何调用,都不会被改变
(2)ES5中,只有函数才能创建作用域

作用域链:

先自己的作用域 => 父 => 逐级向上 => window (如果window没有,就不存在)

三、编译原理

  1. JS代码执行,分为两大阶段 “预编译”“解释执行”
  2. “预编译” 阶段,会把使用var声明的变量和使用function声明的函数提升到 “当前作用域” 顶部
  3. var声明的变量,只提升声明,赋值保留在原位。提升以后,给一个初始值(初始值为undefined)
  4. 如果函数和变量同名,提升的时候,函数定义的优先级高(以函数为准)
  5. ES6的let和const,定义后,才可以使用

四、闭包

定义:闭包是指有权访问另外一个函数作用域中的变量的函数(红宝书page178)
理解:函数跨作用域(里访问外)访问变量,形成闭包,闭包是一种“作用域”的体现。常见的闭包,是父函数嵌套子函数,子函数可以访问父函数的变量,把子函数返回或挂在全局window
优点:私有化变量,避免全局污染
缺点:变量会常驻内存,延迟或不会被JS的垃圾回收机制回收,可能造成比较大的内存开销甚至内存泄漏。

五、面向对象与面向过程

面向过程(POP):所有过程亲力亲为,对细节把控比较清晰 --小兵思维
面向对象(OOP):通过调用各个对象的方法,完成功能,对全局把控清晰 – 将军思维
注意:面向过程和面向对象都是编程的思想

六、原型

  1. 每一个函数(通常指构造函数),都有一个属性 prototype,就是原型(显示原型)
  2. prototype的值是一个普通的对象,默认有两个属性constructor__proto__
  3. 原型prototype上的所有属性和方法,被所有创建出来的实例对象共享(继承)
  4. 原型prototype,有一个属性constructor,指向构造函数本身
  5. 每一个实例对象,都有一个属性__proto__(隐式原型),指向自己构造函数的显示原型(prototype)
  6. JS对象方法查找规则:先自己 => 往原型链上找 => 直到顶层 null

七、原型链

  1. 构造函数prototype(显示原型),也是一个普通对象,也有__proto__(隐式原型),指向上一级构造函数的显示原型prototype
  2. 逐级往上,直到Object.prototype,Object.prototype也有__pooto__,指向 null

八、this的七种指向以及改变this指向

全局 window
函数 调用者
对象方法 调用者
事件响应函数 时间源
构造函数 实例对象
定时器 window
箭头函数 上一级作用域(所处的作用域)在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值