JavaScript中的执行上下文和执行栈

news2025/2/24 15:59:59

执行上下文概念以及理解

执行上下文是评估和执行JavaScript代码环境的抽象概念,但我们在JavaScript中所做的声明变量,声明函数,执行函数。他们都是在执行上下文中运行,也有了所谓的作用域。

执行上下文的类型

执行上下文分为三种类型,例如全局申明挂到window下的变量就是全局执行上下文; 函数被调用时创建的上下文的上下文类型为函数执行上下文,以及不常用的Eval也有属于自己的执行上下文

  1. 全局执行上下文 默认的上下文,其实就是全局对象window。任何不在函数内部的代码都在全局上下文中。
    会执行俩个事件:创建一个全局的window对象,设置this指向这个全局对象,一个程序中只有这一个全局执行上下文
// 这里声明的这个window下的变量上下文就是window
var windowVaribale 

// 挂在window下的函数,
function windowFunction (){
	console.log(this)
}
// 直接执行,执行上下文就是全局执行上下文
windowFunction() //这里的this 指向window

2.函数执行上下文 一个函数被调用时,都会创建一个新的上下文。每个被执行的函数都有自己的执行上下文,被调用时创建。谁调用this指向谁

  let functionIntegratio = {
            sayHello: function () {
                alert("hello")
            },
            yell: function () {
                alert("Hamburger")
                console.log(this)
            }
        }
        let consumer = {}
        consumer.yell = functionIntegratio.yell //这里yell 的执行上下文时consumer对象


        consumer.yell() // 这里的this 指向consumer --- 谁调用this指向谁

        let windowsFunction = functionIntegratio.yell
        windowsFunction()  // 这里this 是window

3.Eval 不讨论,因为不会,面试也不问

执行栈

所谓非计算机的人,like me . 难以理解害怕接触的痛
其实就是拥有LIFO(后进先出)数据结构的栈–last in first out (真他妈装呗),被用来存储代码创建的所有执行上下文
JavaScrpt引擎第一次遇到你的脚本时,会创建一个全局执行上下文并且压入当前执行栈。没当引擎遇到一个新的函数调用,就会给新的函数创建一个新的执行上下文,然后把新的上下文压进栈顶,again and again
Util some funciton is finished . then let it out , 然后控制流程达到打钱栈中的上一个上次问

鬼鬼 悟了!
所谓后进先出 , 先进先出不过是一种数据结构,而执行栈不过就是后进先出的数据结构,在这种数据结构下,才有了我们现在执行函数时候依次执行,有自己的作用域,this 指向

	function start () {
	console.log('Hello, mother funcker')
	(function functionInStart(){
		console.log("bla bla ")
	})()
 }
 // 这里首先创建start函数的执行上下文,就是先把start的指向上下文压(push)到栈顶 ,然后指向,执行到start函数里面的子函数时,创建了子函数的新的执行上下文,这个时候把子函数压到栈顶,先执行栈顶的函数,然后等子函数执行完,后入先出Last in first out,把子函数扔了,然后就是栈中应该执行的start函数,easy

晚上看到某个大哥给先进先出,后进先出俩种数据结构附的图,精彩,好理解。

俩种数据结构罢了,队列先进先出(FIFO)。执行栈后进先出(LIFO),测
在这里插入图片描述
在这里插入图片描述

词法作用域

JavaScript 采用的是词法作用域,函数的作用域在被定义的时候就决定了

var value = 1;

function foo() {
    console.log(value);
}

function bar() {
    var value = 2;
    foo();
}

bar();

// the result is 1 . cause the lexical scope is already confirm when the function is defined 


// so ... if we remove funciton foo to bar inside, the console result will be 2
var value = 1;

function bar() {
	function foo() {
	    console.log(value);
	}
    var value = 2;
    foo();
}

bar();

An example form 《JavaScript:The Definitive Guide》

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

results all is ‘local scope’

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建vite+vue+electron项目

写在前面的废话 首先,这是一篇缝合文,我的目的就是想用vite、vue结合electron打包一个windows应用;其次,项目只是这三个工具的简单应用,目前还没有往里面添加其他内容。再次,项目过程中参考了google的多篇文…

执行数学的运算

数学是计算机编程的重要能力。遗憾的是,对shell脚本来说,这个处理过程比较麻烦。在shell脚本中两种途径来进行数学运算。 expr命令 最开始,Bourne shell提供了一个特别的命令用来处理数学表达式。expr命令允许在命令行上处理数学数学表达式。…

EMQX vs VerneMQ | 2023 MQTT Broker 对比

引言 EMQX 和 VerneMQ 都是用 Erlang/OTP 开发的高性能、分布式开源 MQTT Broker,以其稳定性、容错性和扩展性著称。 EMQX 是目前全球最受欢迎的 MQTT Broker 之一,而 VerneMQ 项目近年来却没有积极地开发和维护。 本文是《2023 年 MQTT Broker 对比》…

可视化电子标签在仓储管理上的应用

随着经济快速增长和激烈的国内外市场竞争,要求企业运作的每个环节反应要迅速,经济转型要求更趋向改善工作流程、提高作业效率、减低运作成本、增加企业效益成为当务之急。虽然许多企业都有实施库存管理系统,但系统主要以人工盘点和走单据流程…

请收下这些软件测试学习干货,不看后悔一辈子

学习软件测试的过程中会遇到很多很多的困难和挑战,只有跨过这些困难和挑战,才有机会挑战软件测试领域的高薪offer。今天我们就来梳理一下,学习软件测试的过程中,我们一般都会遇到哪些困难,我们又当如何克服这些困难。 …

ChatGPT/大模型+零代码,给中小企业带来哪些机会?

ChatGPT让2023年成了AI之年。正如iPhone在2007年开启了智能手机时代,我们现在正在进入人工智能时代。 新形势下,零代码应如何借势发力?伙伴云“AI零代码”给出了答案。 作为零代码领域的头部平台,伙伴云全量发布【AI零代码应用搭…

暖通空调系统智能化故障检测诊断研究综述与展望

暖通空调系统智能化故障检测诊断研究综述与展望 【摘 要】暖通空调系统智能化化故障检测与诊断对提高运维水平和能源效率具有重要意义。 本文总结了暖通空调故障检测与诊断领域近二十多年来的研究历程,探讨了基于规则、基于模型和基于数据等三类主流方法的优劣&…

一键生成!如何为整个go项目自动添加单测

效果 为go项目中每个go文件生成对应的test文件,为每个接口生成对应的单测接口。 类似于这样,为go项目中每个包都生成一个test文件,单测模板如下: 比如函数接口为func releaseEndpoint(instanceID string, endpointID string) er…

微信小程序中使用 wx.getLocation获取当前详细位置并计算距离

文章目录 前言1,wx.getLocation()2,获取详细地址3,计算距离4,报错信息: getLocation:fail 频繁调用会增加电量损耗5,报错信息: 请求源未被授权 前言 wx.getLocation只能够获取经纬度&#xff0c…

java Maven 的理解

一、maven项目产生的原因 当开发两个Java项目,姑且把它们称为A、B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 答:可以将B项目打成jar包,然后在A项目的Library下导入B的ja…

保姆级教程|昨晚撸了一个ChatGPT群聊机器人

前言 近期ChatGPT可以说是太火了,问答、写论文、写诗、写代码,只要输入精确的prompt,他的表现总是让人惊喜。本着打不过就加入的原则。要是把ChatGPT拉入群聊中,会是怎样一番场景?说做就做,花了1个晚上捣鼓…

ChatGPT与文心一言对比思考

ChatGPT与文心一言对比思考 1. 目前在国内比较广泛被认知的ai模型有什么 我目前通过各种渠道注册到的账号有3个,按照了解到然后注册的顺序分别是 ChatGPTnewbing文心一言 3种ai的注册渠道 ChatGPT注册: 科学上网注册寻找外网手机号发送短信 newbing注册: 科学上网注册微软账…

政企数智办公巡展回顾 | 通信赋能传统行业数智化转型的应用实践

在宏观政策引导、技术革新与企业内部数字化改革需求的共同驱使下,数智办公已经成为各行各业转型升级的必由之路。关注【融云 RongCloud】,了解协同办公平台更多干货。 近期,“连接无界 智赋未来” 融云 2023 政企数智办公巡展在北京、杭州相…

【Java】EnumSet的使用

一、什么是EnumSet? EnumSet是用于枚举类的专用Set集合。 它实现了Set接口并且继承AbstractSet。 当计划使用EnumSet时,必须考虑以下几点: 1、它只能包含枚举值,并且所有值必须属于同一个枚举。 2、它不允许添加 null,在尝试这样做时会抛出NullPointerException。 3、它不…

【SpringCloud AlibabaSentinel实现熔断与限流】

本笔记内容为尚硅谷SpringCloud AlibabaSentinel部分 目录 一、Sentinel 1、官网 2、Sentinel是什么 3、下载 4、特性 5、使用 二、安装Sentinel控制台 1、sentinel组件由2部分构成 2、安装步骤 1.下载 2.运行命令 3.访问sentinel管理界面 三、初始化演示工程 …

KVM虚拟机的磁盘无损扩容方法-qcow2格式的

起因:我的KVM主机上安装了基于Debian11的 虚拟机母鸡,其他虚拟机都由此克隆而来。因为最初只配置了8G的虚拟硬盘,因此在需要占用比较大的空间的应用时,就比较麻烦。度娘等中文搜索结果没找到答案,只能google了。 这里…

JVM系统优化实践(16):线上GC案例(一)

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~ 列举几个实际使用案例说一下GC的问题。一个高峰期每秒10万QPS的社交APP,个人主页模块是流量最大的那个,而一次个人主页的查询&#xff0c…

python文本自动伪原创-ai一键伪原创

chatgpt批量伪原创的优势 ChatGPT是一个由OpenAI开发的强大的自然语言处理模型,它具有批量伪原创的优势,以下是这些优势: 模型能够处理大量的数据:ChatGPT通过训练大规模的语言模型来生成伪原创文本。这个模型拥有一个庞大的语料…

MySQL:varchar与date类型互转,对接java数据类型String和Date

目录 问题现象: 问题分析: varchar 转 date : date 转 varchar: 解决方法: varchar 转 date : date 转 varchar: 问题现象: 今天在项目中遇到一个问题: 现象&…

将DataTable中的数据保存到Excel (二) 使用NPOI

文章目录 背景1 NPOI 简介2 使用NPOI2.1 创建一个简单的工作簿2.2 简单的读取内容2.3 将DataTable数据导出到Excel(NPOI)2.4 Excel(NPOI)导入到DataTable 3 NPOI 总结 背景 前面写过一篇DataTable导出到Excel的文章,使用的是Office COM组件进行导入导出&#xff0c…