JavaScript 基础

234 阅读2分钟

常用概念

  • 闭包、原型
  • 类、继承
  • MVC、Flux
  • 高阶函数
  • 前端工程化

JS 引擎

JS 引擎举例

  • Chrome 用的是 V8 引擎,C++ 编写
  • 网景用的是 SpiderMonkey,后被 Firefox 使用,C++
  • Safari 用是的 JavaScriptCore
  • IE 用的是 Chakra(JScript9)
  • Edge 用的是 Chakra(JavaScript)
  • Node.js 用的是 V8 引擎

主要功能

  • 编译:把 JS 代码翻译为机器能执行的字节码或机器码
  • 优化:改写代码,使其更高效
  • 执行:执行上面的字节码或者机器码
  • 垃圾回收:把 JS 用完的内存回收,方便之后再次使用

执行 JS 代码

准备工作

  • 提供 API:window/document/setTimeout
  • 这些功能称为运行环境 runtime env
  • 一旦把 JS 放进页面,就开始执行 JS

JS 内存图

JS.png

图片来源:饥人谷

红色区域

  • 作用
    • 专门用来存放数据
    • 红色区域并不存变量名,变量名在“不知什么区”
    • 每种浏览器的分配规则不一样
  • Stack 和 Heap
    • 红色区域分为 Stack 栈 和 Heap 堆
    • Stack区特点:每个数据顺序存放
    • Heap区特点:每个数据随机存放
  • 规律
    • 数据分两种:非对象和对象
    • 非对象都存在 Stack
    • 对象都存在 Heap
    • = 号总是会把右边的东西复制到左边(不存在什么传值和传址)

JS 入门三座大山之原型

浏览器在 JS 执行之前自带

  • window
  • console
  • document
  • 对象(object)
    • var person = {} 等价于 var person = new Object()
  • 数组(Array)
    • var a = [1,2,3] 等价于 var a = new Array(1,2,3)
  • 函数(Function)
    • function f(){} 等价于 var f = new Function()

window 在内存图中

image.png

图片来源:饥人谷

  • 指针/引用的意思:保存地址
  • 查看函数结构:console.dir(window.Object)

细节

  • 关于 window
    • window变量 和 window对象 是两个东西
    • window变量 是一个容器,存放 window对象的地址
    • window对象 是Heap 里的一坨数据
  • 同理
    • console 和 console对象 不是同一个东西
    • Object 和 Object函数对象 不是同一个东西
    • 前者是内存地址,后者是一坨内存

JS 原型链

image.png

图片来源:饥人谷

注意

  • obj 有一个隐藏属性
  • 隐藏属性存储了 Object.prototype 对象的地址
  • obj.toString() 发现 obj 上没有 toStrong
  • 就去隐藏属性对应的对象里面找
  • 于是就找到了 Object.prototype.toString

prototype 和 __proto___的区别

  • 都存着原型的地址
  • prototype 挂在函数上
  • __proto__ 挂在每个新生成的对象上