[JS]大话执行环境和作用域链

AI Agent + 大数据 + RAG:电商用户行为分析的低成本落地 本文探讨了AIAgent与大数据技术在电商用户行为分析中的应用。通过构建"数据采集-实时分析-智能决策"的全自治链路,解决了传统大数据分析的三大痛点:人工建模周期长、实时性不足和决策闭环断裂。系统采用Flink+Spark处理实时数据,结合基于DeepSeek-V3.1的AIAgent实现智能分析,并通过飞书RAG模块动态获取业务知识。落地效果显示,分析响应时间从2-3天缩短至30秒,推荐转化率提升134%,验证了该方案在提升电商数据决策效率方面的显著价值。 阅读详情

十分钟快速掌握版

在学习JS的过程中,我们经常会碰到一个概念就是JS的执行环境、作用域链。

今天我们用十分钟的时间,彻彻底底搞懂JS的执行环境、作用域链的概念。

JS执行环境

JS的执行环境分为两种:

1、全局环境

2、局部环境

全局环境

全局环境是最外围的执行环境,在Web浏览器中,全局环境被认为就是我们众所周知的window对象。因此所有的全局变量和函数都挂载在window对象下面。例如:

var name='DaMai';
window.name;     //由于var name在全局环境中定义,所以是全局变量,输出:'DaMai'
function sayName(){
    console.log(name);   //由于name是全局变量,根据作用域链(这个稍后再讲)输出:'DaMai'
}
winsow.sayName            //由于sayName在全局环境定义,所以sayName作为了全局方法挂载在window对象下,输出:function sayName()
window.sayName()           //调用了sayName方法,输出:'DaMai'

上面这个代码片段,其实很真切的让我们感受到了全局环境,在Web浏览器中,所有的变量声明和方法声明其实都被挂载在了window对象下。

局部环境

没有块级作用域

在讲局部环境之前,我相信很多同学像我一样学习过Java的同学,刚开始看到下面这个代码,会觉得不可思议。

for(var i=0;i<10;i++){
    console.log(i);       //依次输出:1,2,3,4,5,6,7,8,9
}
console.log(i);           //输出:10
                         //不可思议的点,由于Js没有块级作用域的概念,所以其实var i还是在全局环境中定义的。
window.i;                //输出:10。很好的说明了i是在全局环境中被定义,并被挂在了window对象下。

这段代码片段,我其实想在讲局部环境之前,想给大家一个概念:

JS中没有块级作用域的概念,只有全局作用域和函数作用域,与之对应的就是全局环境和局部环境

由于没有块级作用域,所以for循环中的var i=0其实是在全局环境定义的。因此被挂在在window对象之下,所以我们通过window.i;能输出10。

回到正题,

局部环境(函数环境,更直观),每个函数都有自己的执行环境,当执行流进入该函数时,函数的执行环境就被推入到环境栈中,当函数代码执行完毕之后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁,环境栈就将该执行环境弹出,将控制权返回给之前的执行环境。

注释:全局环境直到应用退出,——例如关闭网页或者浏览器,才会被销毁。

这句话可能比较晦涩难懂,我用下面这个例子,直白的说明这句话:

        var name='DaMai';
    function getName(){
        return name;
    }
    function sayName(){
        var firstName='Da';
        console.log(firstName);
        console.log(getName());         //输出'DaMai',局部环境能访问全局环境中的变量和函数
        console.log(name);             //输出:'DaMai',局部环境能访问全局环境中的变量和函数
        function sayFirstName(){
            console.log(firstName);
        }
        sayFirstName();
    }
    console.log(name);//由于是全局环境声明的name变量,所以输出:'DaMai'

    sayName();    //由于是在全局环境声明的方法,所以全局环境能调用,
                  //调用后执行函数代码,sayName局部环境进入环境栈,输出:'Da'、'DaMai'、'DaMai'和'Da'。
                  //在执行流执行完所有sayName的代码后,销毁sayName的局部环境,又回到了全局环境

    console.log(firstName);   //由于firstName是在局部环境中声明,所以当函数执行完毕后,
                            //sayName中定义的局部变量声明firstName和局部环境中的方法sayFirstName已经被销毁,
                            //在全局环境中已经无法访问

上面这段代码很好说明了前面那段晦涩难懂的话,由于在局部变量中被定义的变量和函数,会在代码被执行完成后销毁;局部执行环境被弹出环境栈。

作用域链

作用域链其实可以理解成由于全局作用域和局部作用域、局部作用域和局部作用域相互嵌套,形成作用域链。各个作用域像链条一般串在了一起。当前执行的环境能够通过作用域链去访问链条上的变量和函数。

        var red='red';
    function sayColor(){
        var blue='blue';
        console.log(red);   //当执行流在sayColor局部环境时,能够访问上一个环境,即全局环境window的参数和函数
        console.log(blue);   //同上
        // console.log(green);//报错,因为当sayColor被调用,执行流在sayColor局部环境中时,
                              //不能访问下一个环境sayOtherColor,因为sayOtherColor还未进入环境栈

        function sayOtherColor(){
            var green='green';     
            //当sayOtherColor被调用时,执行流进入sayOtherColor环境,
            //sayOtherColor环境被推入环境栈,
            //所以此时的环境栈从顶部到底部依此是:sayOtherColor->sayColor->全局环境。
            //根据作用域链的规则:内部环境能够通过作用域链访问所有外部环境的变量和函数。
            //所以:sayOtherColor能够访问sayColor环境和全局环境中的变量和方法。
            console.log(red);      
            console.log(blue);
            console.log(green);
        } 
        sayOtherColor();   //调用sayOtherColor
    }
    sayColor();
    console.log(blue);    //输出:ReferenceError: blue is not defined,因为外部环境不能访问内部环境的任何变量和函数

将代码中的环境串成作用域链,如下图:

内部环境能够通过作用域链访问所有外部环境变量和函数,外部环境不能访问内部环境的任何变量和函数

内部环境能够通过作用域链访问所有外部环境变量和函数

所以我们可以根据上面那图来理解:

当sayColor函数被调用的时候,此时环境栈从顶部到底部:sayColor->全局环境,
所以sayColor能访问自身的变量var blue='blue'和自身函数sayOtherColor()以及外部环境的变量和函数,即全局环境的变量和函数。

当sayOtherColor函数被调用的时候,此时的环境栈从顶部到底部:sayOtherColor->sayColor->全局环境,所以sayOther能访问自身变量var green='green'
以及通过作用域链,访问外部所有环境的变量和函数,即访问sayColor和全局环境的所有变量和函数。

外部环境不能访问内部环境的任何变量和函数

外部环境不能访问内部环境的任何变量和函数,所以在全局环境访问blue变量,会报ReferenceError: blue is not
的错误。

同理,在sayColor环境访问green变量也会报这个错误。

标识符搜索沿着作用域链一级一级的向上搜索
        var color="red";
    function sayColor(){
        var color="green";
        console.log(color);  //由于在局部环境搜索到color变量,则停止向上搜索,所以不会访问全局环境的color变量,
                            //输出:green
        function sayHi(){
            console.log('sayColor:sayHi');
        }
        sayHi();   //由于在局部环境搜索到sayHi()函数,则停止向上搜索,
                 //所以不会访问全局环境的color变量,输出:sayColor:sayHi
    }
    function sayHi(){
        console.log('全局环境:sayHi');
    }
    sayColor();
    console.log(color);

由于在局部环境找到color标识符和sayHi标识符,所以局部作用域会停止向上搜索,因此输出:green
和sayColor:sayHi
再看下一个例子:

        var color="red";
    function sayColor(){
        console.log(color);  //由于局部环境没有找到color标识符,向上查找,找到全局环境中的color变量,因此输出:'red'  
        sayHi();     //由于局部环境没有找到color标识符,向上查找,找到全局环境中的SayHi()函数,因此输出:'全局环境:sayHi'
    }
    function sayHi(){
        console.log('全局环境:sayHi');
    }
    sayColor();
    console.log(color);  输出:'red'

由于在局部环境找到color标识符和sayHi标识符,所以局部作用域会向上搜索,在全局环境中找到了color变量和sayHi()函数,因此输出:red和全局环境:sayHi

作用域链总结:

1、作用域链其实就是全局作用域和局部作用域、局部作用域和局部作用域嵌套,形成一个作用域链条。环境通过作用域链可以访问链条上的变量和函数。

2、内部环境能够通过作用域链访问所有外部环境变量和函数,外部环境不能访问内部环境的任何变量和函数。

3、标识符搜索沿着作用域链一级一级的向上搜索

我是大麦,如果喜欢我的文章,请给我一个小心心。

PCIe协议之 Equalization篇 之 谈谈几种模式 对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 Bypass-Equalization-to-Highest-Rate 模式的,即便采用了,也不会针对 8 GT/s 或 16 GT/s 的目标速率进行 EQ。对于支持 32 GT/s 及以上速率的设备,其可能根本无需工作在 8 GT/s 或 16 GT/s 速率,这时再针对 8 GT/s 或 16 GT/s 速率进行 EQ,多少有点浪费。 阅读详情

相关推荐

USB PD Sink HUSB238A可应用于24V电动风扇/电动工具

HUSB238A在I2C模式下,可申请PD3.1 EPR AVS功率,可申请24V电压直接给电机供电

Hynetek的博客 759

JavaScript执行环境与作用域【链】

JavaScript执行环境共分两种:局部执行环境与全局执行环境。 当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。

Le_JackChen的博客 396

DeepSeek研发的精算大模型「精卫」已实现98%精算任务覆盖,中国人寿采用后年节约3.2亿元技术采购成本,形成关键技术替代效应

根据现有资料,精算领域关键技术替代效应的行业标准定义尚未明确具体提及。然而,可以从相关文献中提取一些关键概念和方法来推导出可能的定义。​替代效应的基本定义​:替代效应是指一种商品价格变动引起另一种商品的相对价格变动,从而导致消费者在维持原有效用水平不变的条件下对商品需求量做出的调整。​技术替代效应​:在精算领域,技术替代效应可以理解为新技术或新方法对现有技术或方法的替代,从而影响精算模型、数据处理和决策过程。例如,机器学习在精算中的应用日益增长,改变了精算师的工作方式和模型构建方法。​。

百态·数智思维 | 聚焦大数据、量化与未来AI 1712

从js闭包谈到作用域、作用域链、执行上下文、内存管理

闭包是 JavaScript 中最基本也是最重要的概念之一。可是闭包又绝对不是一个单一的概念: 它涉及作用域、作用域链、执行上下文、内存管理等多重知识点。

全栈弄潮儿 1268

lumerical中DEVICE和MODE模块的交互使用(真的很干货!!可以自信的说网上绝对找不到比我更详细的步骤了)

几个脚本文件很重要! Lumerical仿真流程: 一、DEVICE: (1).建模并且运行完之后,在脚本提示符下键入以下脚本行以运行plotDopingProfile.lsf如图1(文件名如果索引不到的话就可以把文件直接用notepad++打开,然后把代码直接输入到device中script脚本中 如图2)脚本文件并生成下图 如图3: (图2) (图1) (图3) (2).仿真...

1万+

精通DC-DC变换器:Boost升压电路全解析

Boost升压变换器是一种将低直流电压转换为高直流电压的常用电路。其核心工作原理是通过电感储能:开关导通时电感充电,关断时电感与电源串联向负载供电。关键公式表明输出电压Vo=Vi/(1-D),占空比D越大,升压比越高。变换器工作时会产生电感电流纹波和输出电压纹波,需合理选择电感和电容参数。开关管和二极管需承受完整的输出电压,对元器件选型要求较高。理解这些原理是设计高效升压电源的基础。

2511_92918351的博客 3707

执行环境和作用域链

javascript执行环境和作用域执行环境执行环境是一种机制,用来处理JavaScript运行时的作用域和生存期等; 1.执行环境的作用:定义了变量或函数有权访问的其他数据,决定了他们各自的行为。 2.全局执行环境 全局执行环境是最外围的一个执行环境;在浏览器中,全局执行环境是window对象;因此所有的全局变量和函数都是window对象的属性和方法,在第一次载入Javascript代码时会

A_dangdang的博客 694

PP触发EWM产生PMR捡配

PP触发EWM产生PMR捡配 前言 PMR: Production Material Request 在流程订单/生产订单下达后,可以在EWM中产生PMR,在EWM中, PMR其实代表了ERP中的流程订单/生产订单。 You can use SAP EWM in conjunction with the following PP application components: • Production Orders • Process Orders • Repetitive Manufacturing •

ZevYang的博客 1918

深入理解JavaScript的执行环境、作用域与作用域链及闭包

执行环境(执行上下文EC) 来自JS高设--执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量中。虽然我们编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它。每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行后,栈将其环境弹出,把控制权返回...

Eternal_tyq的博客 1260

SQL注入绕过information_schema:实战技法与替代路径详解

SQL注入是Web安全领域的核心漏洞类型,其原理是通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑,从而窃取或篡改数据。在渗透测试与CTF竞赛中,绕过常见防护措施是提升技术能力的关键。当标准的信息收集方式受阻时,例如无法访问information_schema数据库,攻击者需要掌握替代的元数据获取方法。这些技术价值在于模拟真实环境中日益严密的防御体系,锻炼在受限条件下的系统性信息收集思维。典型的应用场景包括存在WAF过滤、权限限制或编码干扰的实战环境。本文将围绕SQL注入这一核心,深入探讨如何利用

weixin_33980459的博客 429

刷爆 Java 基础!1000 道经典面试题精解第一篇【序列化】

自定义序列化 / 反序列化的实现方式在实现接口的类中,手动重写和方法在方法内优先调用执行默认序列化逻辑;追加自定义逻辑(如敏感数据加密、临时字段赋值、兼容旧版本数据等)。// 序列化ID,保证兼容性// 敏感字段,默认不序列化,自定义处理// 自定义序列化// 执行默认序列化:写入username// 自定义逻辑:密码加密后写入// 自定义反序列化// 执行默认反序列化:读取username// 自定义逻辑:读取加密密码并解密// 模拟加密/解密工具方法。

七叔的博客 191

js作用域链和执行环境

Js作用域:我们知道js没有块级作用域,有全局作用域和局部作用域。 验证js没有块级作用域: Js作用域是变量和函数被访问的范围。   执行环境:执行环境可分为全局执行环境和局部执行环境。每一个执行环境都有一个与之关联的变量对象,这个变量对象包含了这个执行环境的变量和函数。 执行环境流机制:每一个函数都有自己的执行环境,当执行流进入到函数的执行环境,这时会把函数这个执行环境放到环境栈...

Amazing刘许许的博客 809

无线传感网络的Matlab实现

Matlab是一种功能强大的数值计算和数据分析工具,也可以用于无线传感网络的建模和仿真。根据实际需求,可以进一步扩展和优化模型,例如考虑节点能量消耗、网络路由、数据融合等方面的问题。函数用于绘制节点之间的连接关系,其中第一个参数是邻接矩阵,描述了节点之间的连接关系。这里使用了一个4个节点的简单例子,可以根据实际需求修改节点数量和连接关系。可以使用Matlab中的图形绘制函数来可视化节点的位置和连接关系。在无线传感网络中,节点的能量是一个关键因素。通过计算节点的剩余能量,可以评估节点的能量消耗情况。

2301_79331387的博客 249

大话javascript 2期:执行上下文与执行上下文栈

一、什么是执行上下文? 执行上下文(Execution Context): 函数执行前进行的准备工作(也称执行上下文环境) JavaScript在执行一个“代码段”之前,即解析(预处理)阶段,会先进行一些“准备工作”,例如扫描JS中var定义的变量、函数名等,进而生成执行上下文。 name - 变量对象(VO, variable...

weixin_34273046的博客 181

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

大话闭包

大话闭包 最近面试一家公司问到闭包,确实不知,现在恶补一下. 作用域链 在理解闭包以前.最好能先理解一下作用域链的含义,简单来说,作用域链就是函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为...

weixin_34301307的博客 150

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Anthropic Managed Agents:Agent 运行时的 OS 化演进

智能体(Agent)作为大模型落地的核心范式,其运行时稳定性、可观测性与安全隔离长期受限于上下文窗口的脆弱性与手工状态管理的工程熵增。随着 Anthropic 推出 Managed Agents,一种以 session 为事件日志、harness 为无状态执行器、sandbox 为微虚拟化计算单元的三层解耦架构正式产品化——这标志着 Agent 开发正从框架拼凑走向基础设施标准化。该设计直击生产痛点:解决上下文遗忘导致的幻觉、tool 调用不可追溯、凭证泄露风险及故障不可恢复等关键问题。其技术价值在于将 r

weixin_30855099的博客 400

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

农码一生博文索引

《.NET Core》 ASP.NET Core 快速入门【第一弹-环境篇】 ASP.NET Core 快速入门【第二弹-实战篇】 《Linux学习》 Linux学习(1)-常用快捷键、文件管理和查询 《C#基础知识巩固》 特性是什么东东 什么是反射、反射可以做些什么 依赖注入是什么 可空类型Nullable<T>到底是什么鬼 谈扩展方法的理解 ...

weixin_30562507的博客 167

javascript中的执行环境和作用域链

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> /** * 每个执行环境都关联一个变量对象,环境中定义的所有变量和方法都会包含在这个对象中 * 我们的代码无法访问这个对象,但是后台会解析它 */

Saltwater_leo的专栏 474

JavaScript执行环境和作用域(链)的那些事

执行环境 什么是执行环境 提起作用域,我们不得不说说什么是执行环境。执行环境定义了变量或函数有权访问的其他数据,并决定其各自的行为。每一个执行环境都有一个对应的变量对象,这个对象的作用就是保存在环境中定义的变量和函数(这个变量对象我们无法直接使用)。   全局执行环境 在JavaScript中window对象表示的是全局执行环境,全局执行环境是最外围的环境,所有的全局变量和函数都是作为w...

如是说的博客 284

js 执行环境、作用域链和闭包

执行环境: 定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中(如同全局环境下的变量和函数保存在window对象内) 执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁(全局执行环境直到应用程序退出,例如关闭网页或浏览器时才会被销毁) 只有函数有自己的执行环境,当执行流进入一个函数时,函...

NewWent的博客 382

执行环境及作用域链

一 , 执行环境及作用域链 执行环境 : 是js中最为重要的一个概念,它定义了变量或函数有权访问的其他数据,决定了它们各自的行为,每个函数都有自己的执行环境. 变量对象: 每个执行环境都有与之关联的变量对象.它保存了这个环境中定义的所有变量和函数 执行流 : 当执行流进入一个函数,函数的环境就会被推入一个环境栈中,当执行环境中的所有代码执行完毕,栈将其环境弹出,把控制权返回给之前的执行环...

aidong8570的博客 152
上一篇: [JS]闭包就是这么简单
下一篇: [JS]大话this指针
VikcyWinner
博客等级 码龄11年 12粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值