JavaScript 执行上下文和作用域链

执行上下文

执行上下文决定了变量和函数可以访问哪些数据。

一个执行上下文就对应一个仅后台可访问的变量对象,其中保存有该上下文的局部变量、参数和函数声明。

最外层的上下文称为全局上下文。宿主环境不同,全局上下文的关联对象就不同。在浏览器中,全局上下文就是window 对象。

注意window后没有s

除了 window 对象自带的属性外,使用var定义的全局变量和函数都会成为其属性。

var具有函数作用域,let和const具有块级作用域

var a1=1;
function func(){var a2=2;
}
console.log(a1); //输出1
console.log(typeof a2 === "undefined"); //输出true
console.log(window.a1); //输出1

window.a1也可以写成window['a1']

一般的上下文在其代码执行完后就销毁,而全局上下文是在程序退出时才被销毁。

执行上下文会按照函数的调用顺序形成一个堆栈,称为执行上下文栈

当前执行上下文位于执行上下文栈的顶端,当它执行完后会被弹出,程序的控制权就交给之前的上下文。

我们用到的、见到的this指针指向的就是这个当前执行上下文,其值取决于函数的调用方式。

作用域链

作用域链(scope chain)决定了变量和函数的访问权限和顺序,这个链的最前端是当前执行上下文的变量对象。

作用域链的先后顺序就是内外顺序,内部执行上下文包含了外部执行上下文。换句话说,内部执行上下文可以访问外部执行上下文。

我们访问变量和函数的顺序就是从作用域链的前面往后面找。

看个例子:

const a4=4;
var a5=5;
const func1 = function (a3) {const a2=2;function func2() {const a1=1;return function func3(){console.log(a1+a2+a3+a4+a5);}};return func2();
};
const result=func1(3);
result();

image-20230829134446401

[[Scopes]]记录的是变量的父作用域链,可以看到result并没有func3的上下文。


作用域链增强

有两个影响作用域链的行为:withtry/catch的catch块

使用with将指定对象的作用域推入上下文栈:

let person={name:'Carl',age:22
}
with(person){console.log(name+"'s age is "+age);
}

try/catch语句的catch块是一个单独的上下文,捕获的错误信息被添加到catch块的变量对象上,于是只能在catch块才能访问该错误。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.4状态机模型

状态机简介: 1.大盗阿福 阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N N N家店铺,每家店中都有一些现金。 阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时&#xff0…

数据指标体系峰会——构建与应用

京东物流指标体系 流量指标体系 如何构建和应用指标体系 落地关键保障与举措 数据标准化,一致化比较困难。 火山引擎抖音集团指标分析与增长实践指南 实践Case 指标分析方法 策略假设方法论 《测出转化率》 lift模型 紧急度: 外部驱动&#xff…

【C++笔记】C++内存管理

【C笔记】C内存管理 一、C中动态内存申请的方式二、new和delete的实现原理2.1、operator new和operator delete函数 一、C中动态内存申请的方式 在C语言中我们需要动态申请空间的时候我们通常都是用malloc函数,但是malloc函数对自定义类型是没什么问题的&#xff0…

Linux基础学习2

Linux基础学习2 popen函数 popen函数 https://blog.csdn.net/yzy1103203312/article/details/78483566 https://blog.csdn.net/xy1413_/article/details/127135608 典型用法: FILE * fp popen("ifconfig eth0", "r"); if (!fp) { fprintf…

微服务-sentinel详解

文章目录 一、前言二、知识点主要构成1、sentinel基本概念1.1、资源1.2、规则 2、sentinel的基本功能2.1、流量控制2.2、熔断降级 3、控制台安装3.1、官网下载jar包3.2、启动控制台 4、项目集成 sentinel4.1、依赖配置4.2、配置文件中配置sentinel控制台地址信息4.3、配置流控4…

ps beta 2.5的妙用

1、https://pan.baidu.com/s/1CCw6RGlzEJ7TPWou8pPADQ?pwd2023 2、下载新便携版。 3、解压到c:\myapp文件夹下。 4、运行。 5、登录us账号。 6、使用智能移除。 效果如下: 使用滤镜。 先将C:\myApp\(新便携版)Adobe Photoshop (25.0.0 m22…

MFC网络编程简单例程

目录 一、关于网络的部分概念1 URL(网址)及URL的解析2 URL的解析3 域名及域名解析3 IP及子网掩码4 什么是Web服务器5 HTTP的基本概念6 Socket库概念7 协议栈8 Socket库收发数据基本步骤 二、基于TCP的网络应用程序三、基于UDP的网络应用程序 一、关于网络的部分概念 1 URL(网址…

只考一门数据结构!安徽工程大学计算机考研

安徽工程大学 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文992字,预计阅读:3分钟 2023考情概况 安徽工程大…

Kotlin inline、noinline、crossinline 深入解析

主要内容: inline 高价函数的原理分析Non-local returns noinlinecrossinline inline 如果有C语言基础的,inline 修饰一个函数表示该函数是一个内联函数。编译时,编译器会将内联函数的函数体拷贝到调用的地方。我们先看下在一个普通的 kot…

LNMP架构之搭建Discuz论坛

LNMP 一、编译安装Nginx1)前置准备2)开始编译安装3)添加到系统服务(systemd启动) 二、编译安装MySQL服务1)前置准备2)编译安装3)编辑配置文件4)更改mysql安装目录和配置文…

Redis-Cluster集群操作--添加节点

一、环境部署 部署好Redis-Cluster集群,参考上个本人的博客:Redis-Cluster集群的部署(详细步骤)_是胡也是福的博客-CSDN博客 新准备一台机器,修改主机名,关闭防火墙和selinux,参考&#xff1a…

ELK高级搜索(三)

文章目录 11.索引Index入门11.1 索引管理11.2 定制分词器11.3 type底层结构11.4 定制dynamic mapping11.5 零停机重建索引 12.中文分词器 IK分词器12.1 Ik分词器安装使用12.2 ik配置文件12.3 使用mysql热更新 13.java api 实现索引管理14&…