调用堆栈

  • 本期的主题是调用堆栈,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    执行上下文是当前 JavaScript 代码被解析和执行时所在环境的抽象概念。

    执行上下文的类型

    执行上下文总共有三种类型

    • 全局执行上下文:只有一个,浏览器中的全局对象就是 window 对象,this 指向这个全局对象。

    • 函数执行上下文:存在无数个,只有在函数被调用的时候才会被创建,每次调用函数都会创建一个新的执行上下文。

    • Eval 函数执行上下文: 指的是运行在 eval 函数中的代码,

  • 本期的主题是调用堆栈,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    JS内存空间分为栈(stack)堆(heap)池(一般也会归类为栈中)。 其中存放变量,存放复杂对象,存放常量,所以也叫常量池。

    昨天文章介绍了堆和栈,小结一下:

    • 基本类型:--> 内存(不包含闭包中的变量)
    • 引用类型:--> 内存

    今日补充一个知识点,就是闭包中的变量并不保存中栈内存中,而是保存在堆内存中,这也就解释了函数之后之后为什么闭包还能引用到函数内的变量。

    fun
  • 本期的主题是调用堆栈,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    堆栈的内容和执行顺序我就不说了,前面两篇已经介绍过了。

    但是今天补充一个知识点:某些情况下,调用堆栈中函数调用的数量超出了调用堆栈的实际大小,浏览器会抛出一个错误终止运行。

    对于下面的递归就会无限制的执行下去,直到超出调用堆栈的实际大小,这个是浏览器定义的。

    function foo() {
        foo();
    }
    foo();

    现在正式开始今天的主题,内存空间详解

    栈数据结构

    栈的结构就是后进先出

  • 本期的主题是调用堆栈,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    JS是单线程的语言,执行顺序肯定是顺序执行,但是JS 引擎并不是一行一行地分析和执行程序,而是一段一段地分析执行,会先进行编译阶段然后才是执行阶段。

    翠花,上代码

    例子一:变量提升

    foo;  // undefined
    var foo = function () {
        console.log('foo1');
    }
    
    foo();  // foo1,foo赋值
    
    var foo = function
  • 本期的主题是调用堆栈,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    上篇文章详细介绍了内存回收和内存泄漏,今天我们继续这个篇幅,不过重点是内存泄漏可能发生的原因。

    垃圾回收算法

    常用垃圾回收算法叫做**标记清除 (Mark-and-sweep) **,算法由以下几步组成:

    • 1、垃圾回收器创建了一个“roots”列表。roots 通常是代码中全局变量的引用。JavaScript 中,“window” 对象是一个全局变量,被当作 root 。window 对象总是存在,