执行JS代码之前的准备工作

  • 提供 API: window I document / setTimeout
  • 没错,上面这些东西都不是 JS 自身具备的功能(是浏览器)
  • 我们将这些功能称为运行环境 runtime env
  • 一旦把 JS 放进页面,就开始执行 JS

    内存分配图

    image.png

    红色区域

    作用

  • 红色专门用来存放数据,目前只研究该区域

  • 红色区域并不存变量名,变量名在「不知什么区
  • 每种浏览器的分配规则并不一样上图的区域并不完整
  • 还没有画「调用栈」、「任务队列」等区域

    Stack 和 Heap

  • 红色区域分为 Stack 栈和 Heap 堆

  • Stack 区特点:每个数据顺序存放
  • Heap 区特点:每个数据随机存放

    注意

  • 数据分两种:非对象(数字、布尔、字符串)对象(数组、函数)

  • 非对象都存在 Stack 对象都存在 Heap
  • = 号总是会把右边的东西复制到左边(不存在什么传值和传址)

    window

    在执行JS代码之前就有了window

image.png
⚠️var person = {} 等价于 var person = new Object ()
⚠️var a= [1,2,3] 等价于 var a = new Array (1,2,3)
⚠️function f () {} 等价于 var f= new Function ()
问:为什么有 var a= [],还要提供 var a = new Array()呢?
答:因为后者是正规写法,但是没人用。前者不正规,但是好用啊。

window的内存图

image.png
更简单的画法
image.png
规律:一般首字母大写(Object、Array)的会有prototype属性

注意

关于 window

  • window 变量和 window 对象是两个东西
  • window 变量是一个容器,存放 window 对象的地址
  • window 对象是 Heap 里的一坨数据
  • 不信的话,可以让 var X = window,那么这个 X 就指向了 window 对象,window 变量可以去死了
  • 但是这样的代码会弄晕新手,所以不要这样写

同理

  • console 和 console 对象不是同一个东西
  • Object 和 Object 函数对象不是同一个东西
  • 前者是内存地址,后者是一坨内存

image.png