专栏首页coding个人笔记JavaScript之调用栈

JavaScript之调用栈

很早之前写过栈和堆的结构,非常简单的介绍了一下,主要是为了明白深拷贝和浅拷贝。最近突然发现了调用栈这个概念,理解这个概念对于一些函数的执行能更清晰的理解,比如递归。

栈(stack)是计算机中特殊的一个数据列表,栈有一个特点就是先进后出。我们可以把栈当做乒乓球的盒子,先放进去的最后才拿出来。今天只说说入栈和出栈两个概念:

代码运行过程中会有调用栈(call stack)的概念,就是解析的机制,栈的一种运行结构。栈一定遵循先进后出。

有时候会让自己钻进牛角尖,比如栈是先进后出,那么代码从上往下执行的时候,上面的代码先入栈,那么为什么上面的输出会先执行?还有数据都是存储在栈里面,为什么随便可以取值?等等等等。

这些都是待研究的,这边自己给了自己一个应该不正确的理解,栈有链式调用,就跟对象一样,所以数据可以随便调用。JavaScript执行上下文是按顺序调用的,只有调用栈也叫作执行上下文栈才是先进后出。而执行上下文在JavaScript中跟作用域一样,一个函数就是一个作用域,就是一个执行上下文。

看下面代码:

console.log('globals' + i);
var i = 1;
fn(1);
function fn(i) { 
 if(i == 4){  
   console.log('fns:'+ i);
 return 
} 
console.log('fns:' + i);
fn(i + 1); 
console.log('fne' + i);}
console.log('globale' + i);
执行结果是:
globalsundefined
fns:1
fns:2
fns:3
fns:4
fne3
fne2
fne1
globale1

代码运行的时候先生成一个window上下文执行栈,然后压入栈中,接着执行到fn(1),把fn(1)压入栈,fn(1)上下文执行,然后执行到fn(2),把fn(2)压入栈,一直到fn(4),执行上下文栈里面是这样的:

Window上下文按顺序执行,输出globalsundefined,fn(1)上下文按顺序执行先输出fns:1,然后就把fn(2)压入栈了,所以就输出fns2,依次一直到fn(4)。这就是入栈的过程。

然后开始出栈的执行,栈顶的先执行,当fn(4)执行完毕,就把fn(4)弹出栈,fn(3)就变成栈顶,fn(3)接着往下执行,输出fne3,然后fn(3)弹出,依次一直到window。这就是出栈的过程。

执行上下文按顺序执行,执行上下文栈(也叫调用栈)严格按照先进后出的顺序执行。

按照正常的顺序思维去理解或许更快更清晰得到答案,只是这些东西对于想要做些什么的还是有必要去了解的。

解释的不是很好,自己是明白了点,但是文字表述的不清楚,还有一些原理我自己也解释不清,欢迎指教也欢迎留言。

(完)

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 严格模式use strict

    JavaScript是一个弱类型语言,这其实跟JavaScript创建之初有关系。当时JavaScript的作者只是随便写一个语言来临时使用,鬼知道JavaSc...

    wade
  • 对权限管理的一些理解

    后台系统几乎都会涉及权限管理,实现的方式有蛮多的,只是前端只能做样子货,最终的权限管理还是得后台做。今天说说自己认知的权限管理的几个方式。

    wade
  • ES6之函数的扩展

    正常情况下没有问题,但是要是a是0或者是false等会被转换成Boolean类型false的时候就会出错。ES6对参数的默认值允许直接设置:

    wade
  • 如何使用sklearn进行数据挖掘

    1.1、数据挖掘的步骤 数据挖掘通常包括数据采集,数据分析,特征工程,训练模型,模型评估等步骤。使用sklearn工具可以方便地进行特征工程和模型训练工作,在《...

    用户1332428
  • Python大法之告别脚本小子---信息资产收集类脚本编写

    在采集到URL之后,要做的就是对目标进行信息资产收集了,收集的越好,你挖到洞也就越多了............当然这一切的前提,就是要有耐心了!!!由于要写工具...

    小小科
  • 必读|spark的重分区及排序

    前几天,有人在星球里,问了一个有趣的算子,也即是RepartitionAndSortWithinPartitions。当时浪尖也在星球里讲了一下,整个关于分区排...

    Spark学习技巧
  • python插入记录后取得主键id的方法(cursor.lastrowid和conn.insert_id())

    cursor.lastrowid跟conn.insert_id()的结果一般情况下是一样的,最后一条记录肯定就是刚刚插入的记录。但如果是并发插入就不一样了,多线...

    周小董
  • C# 数据操作系列 - 11 NHibernate 配置和结构介绍

    今天是NHibernate的第二篇内容,通过上一篇的内容,我们初步了解了NHibernate的创建和使用。这一篇,我继续探索NHibernate背后的秘密。嗯,...

    程序员小高
  • 如何挑选优质光模块?

    俗话说得好“一分钱一分货”,要想物有所值,货比三家绝对是优质买家的必经之路!对于光模块的采买如何发挥火眼睛睛的实力?今天就让我们来道一道这里面的精髓!

    易天光通信
  • Hibernate学习---用Session实现CURD

    我们使用Hibernate的目的是什么?对数据库进行操作,所有接下来我们就用Hibernate来进行CURD。 前边我们已经分析过了Configuration,...

    MindMrWang

扫码关注云+社区

领取腾讯云代金券