js中的数据类型

  1. 基本数据类型
    number , string. boolean ,null , undefined

  2. 引用数据类型
    object: {} , [] , /^$/ , Date
    function

    当浏览器加载HTML页面的时候,首先会提供一个供全局JS代码执行的环境 => 全局作用域(global/window)

预解释(变量提升)

  1. 在当前的作用域中,js代码执行之前,浏览器首先会默认的把所有带var和function的进行提前的声明或者定义
    // 声明和定义
    // 声明:var num; =>告诉浏览器在全局作用域中有一个num的变量了,如果一个变量只是声明,没有赋值,值就是undefined
    // 定义:num = 1; =>给我们的变量进行赋值
  2. 对于带var和function关键字的在预解释的时候操作还是不一样的
    // var => 在预解释的时候只是提前的声明
    // function => 在预解释的时候提前的声明+定义都完成了

  3. 预解释只发生在当前的作用域下。例如:开始只对window下的进行预解释,只有函数执行的时候才会对函数中的进行预解释

js内存的分类(堆内存,栈内存)

栈内存:用来提供一个供js代码执行的环境 -> 作用域(全局作用域/私有的作用域)
堆内存:用来存储引用数据类型的值 -> 对象存储的是属性名和属性值,函数存储的是代码字符串

  1. 如何区分私有变量和全局变量
    1)在全局作用域下声明(预解释的时候)的变量是全局变量
    2) 在‘私有作用域中声明的变量’和函数的形参都是私有的变量

    在私有作用域中,我们代码执行的时候遇到一个变量,首先我们需要确定它是否为私有变量,如果是私有的变量,那么和外面的没有任何的关系,如果不是私有的,则往当前作用域的上级作用域进行查找,如果上级作用域也没有则继续查找,一直找到window为止(作用域链)

  2. 当函数执行的时候(直接目的:让函数体中的代码执行),首先会形成一个新的私有的作用域,然后按照如下的步骤执行:
    1.如果有形参,先给形参赋值
    2.进行私有作用域中的预解释
    3.私有作用域中的代码从上到下执行

函数形成一个新的私有的作用域保护了里面的私有变量不受外界的干扰(外面修改不了私有的,私有的也修改不了外面的)–> 闭包

  1. 如何查找上级作用域
    看当前函数是在哪个作用域下定义的,那么它的上级作用域就是谁->和函数在哪执行的没有任何的关系
  1. 关于内存释放和作用域销毁
    堆内存
    对象数据类型或者函数数据类型在定义的时候首先都会开辟一个堆内存,堆内存有一个引用的地址,如果外面有变量等知道了这个地址,我们就说这个堆内存被占用了,就不能销毁了

    我们想要让堆内存释放/销毁,只需要把所有引用的变量赋值为null即可,如果当前的堆内存没有任何东西被占用,那么浏览器会在闲置的时候把它销毁

    栈内存
    全局作用域(只有当页面关闭的时候全局作用域才会销毁)
    私有作用域(只有函数执行会产生私有的作用域)

    一般情况下,函数执行会形成一个新的私有作用域,当私有作用域中的代码执行完成后,我们当前作用域都会主动的进行释放和销毁

    当前私有作用域中的部分内存被作用域以外的东西占用了,那么当前的这个作用域就不能销毁了

    a. 函数执行返回了一个引用数据类型的值,并且在函数外面被一个其他的东西给接收了,这种情况下一般形成的私有作用域都不会被销毁