JavaScript基础学习笔记

复习也是学习的一部分

  1. 解释下什么是变量声明提升?

    1. 变量提升:在当前作用于中,js代码自上而下执行之前,浏览器会把所有带var/function关键字进行提前声明或定义。

    2. 变量声明提升:通过var定义的变量,在定义语句之前就可以访问到。没定义之前的值是undefined

    3. 函数声明提升:通过function声明的函数,在声明语句之前就可以直接调用。只有函数声明才存在函数提升,匿名函数没有函数提升

  2. JS 的参数是以什么方式进行传递的

    1. 值传递

    2. 复杂类型传递:引用类型传递,函数传递

  3. JavaScript垃圾回收是怎么做的?

    1. JS中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收。

    2. 内存的生命周期:JS环境中分配的内存, 一般有如下生命周期:

      1. 内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存

      2. 内存使用:即读写内存,也就是使用变量、函数等

      3. 内存回收:使用完毕,由垃圾回收自动回收不再使用的内存全局变量一般不会回收,一般局部变量的的值,不用了,会被自动回收掉

    3. 垃圾回收算法:就是判断内存是否已经不在使用了,如果是,就视为垃圾,释放掉。(常见算法:引用计数,标记技术)

    4. 注意: 引用计数存在的问题是,循环引用可以导致内存泄漏

    5. 标记清除法:可以正常清除内存泄漏

      1. 从js根部(全局对象)出发,能够访问到的对象、普通变量、函数等,都是需要用的,不会释放。

      2. 但是如果从js根部,无法访问到,无法触及到(谁都找不到的这块空间),这块空间就是垃圾,需要被回收

  4. 谈谈你对JavaScript作用域链的理解?

    1. javascript在执行过程中会创建一个个的可执行上下文(每个函数执行都会创建这个一个可执行的上下文),这个可执行的上下文就被称为作用域

    2. 每个可执行上下文的词法环境中包含了对外部词法环境的引用,可通过该引用来获取外部词法环境中的变量和声明等。这些引用串联起来,一直指向全局的词法环境,形成一个链式结构,就被称为作用域链

    3. 简而言之,函数内部能访问函数外部的变量,而外部函数能访问全局作用域的变量,这样的变量作用域访问的链式结构,就被成为作用域链。

    4. 拓展:每个函数执行都会放到执行栈里,全局放到栈最下

  5. 谈谈你对闭包的理解?

    1. 考察点:对闭包的基本概念的了解,对闭包的作用的了解

    2. 闭包:闭包是函数和声明该函数的此法环境的组合(官方)。

    3. 闭包:内部函数访问了外部函数的变量,就形成了闭包。(常见应用:实现数据私有,比如计时器)

    4. 代码写法:

      function fun () { 
          let num = 1 ; 
          function inner() { 
              console.log(num) 
          } 
      }

    5. 应用闭包(不让闭包废弃):外部函数return 内部函数就行

    6. 闭包的基本形式:

      function fn () {
          let num = 1
          function inner () {
              num = num + 1
              console.log(num)
          }
          return inner 
      }
      let result = fn() 
      result () 
    7. 闭包的作用:实现数据私有,例如:计数器,函数每执行一次,统计一次count++

      function fn (){ 
          let count = 0
          function inner () {
              count++
              console.log('函数被调用了' + count + '次')
          }
          return inner
      }
      let result = fn()
      result ()
      result ()
      result ()
    8. 闭包造成的内存泄漏。(标记清除:指的是从全局出发,访问不到的内存空间,就会自动被回收)

    9. 解决:result = null // 释放内存,断开了对于之前内部函数的引用,对应的缓存的变量内容也会被释放。

  6. JavaScript中数据类型的隐式转换规则有哪些?

你可能感兴趣的:(javascript,算法,前端)