JavaScript 执行上下文和作用域链

news2024/11/28 15:48:48

1 执行上下文

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

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

最外层的上下文称为全局上下文。宿主环境不同,全局上下文的关联对象就不同。在浏览器中,全局上下文就是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指针指向的就是这个当前执行上下文,其值取决于函数的调用方式。

2 作用域链

作用域链(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的上下文。


2.1 作用域链增强

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

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

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

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

try {
    // 可能会引发异常的代码
    const result = someFunction();
} catch (error) {
    // 捕获异常并处理
    console.error("An error occurred:", error.name, error.message);
    // 在 catch 块内部可以定义局部变量
    const errorCode = 500;
    console.log("Error code:", errorCode);
}

// 在这里无法访问 error 和 errorCode
console.log(error); // 抛出 ReferenceError
console.log(errorCode); // 抛出 ReferenceError

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

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

相关文章

在ubuntu20.04上安装arm-linux-gcc 4.4.3

1下载地址 [http://www.friendlyelec.com.cn/download.asp] 2.将 arm-linux-gcc-4.4.3.tar.gz 拷贝到 /bin目录 无法拷贝怎么办? 出现这种情况是 Linux 拷贝文件时权限不够, 运行命令 sudo nautilus, 打开一个具有管理员权限的文件管理器&am…

C# 子类如何访问子类的方法(同一父类)

在继承关系中,子类可以通过创建另一个子类的对象来访问其方法。下面是一个示例,展示了子类如何访问另一个子类的方法: public class Animal {public virtual void Speak(){Console.WriteLine("我是动物。");} }public class Cat :…

直播平台源码开发搭建APP的DASH协议:流媒体技术其中一环

在直播平台源码APP中,有着许许多多、多种多样的功能,比如短视频功能,帮助我们去获取信息,看到全世界用户身边发生的事情或是他们的生活;又比如直播功能,为用户提供了实时的娱乐享受,还让一些用户…

嬴图Ultipa | 实时图计算如何将反洗钱进行到底?

电影《孤注一掷》中,首度曝光了境外网络诈骗全产业链黑幕,而洗钱是最为关键的一环。 王大陆饰演的赌徒阿天将偷和抵押房产凑够的800万元一次性汇入欺诈团伙的博彩账户,由于涉及大额资金流动,警方已经开始监控。令人意外的是&#…

访问局域网内共享文件时报错0x80070043,找不到网络名

我是菜鸡 此篇只为分享一个我遇到的很简单的但是排查了好久的小问题。 我的网络环境是在校园网内, 自己的办公电脑设置了固定IP:10.11.128.236,同事电脑IP为:10.11.128.255 本人需要访问同事在局域网内分享的文件,…

统计学极简入门——数据分布

3. 数据分布 t分布、F分布和卡方分布是统计学中常用的三种概率分布,它们分别用于样本均值的推断、方差的比较和数据的拟合优度检验。 总之这3个分布很有用,首次接触你可能理解不了,但没关系你知道很重要就行了,接着往下看&#…

6.xpath的基本使用

xpath是python做数据解析的库 目录 1 安装 2 解析本地的html文件 2.1 只有一个标签的情况 2.2 有多个标签的情况 3 解析网上的页面 4 xpath表达式 4.1 绝对路径 4.2 两个斜杠表示中间隔了0级或多级 4.3 通过属性查找 4.4 通过索引查找 4.5 获取文本内容…

JavaScript-----运算符与流程控制

目录 前言: 1. 运算符 1.1 算术运算符 1.2 赋值运算符 1.3 比较运算符 1.4 逻辑运算符 2.流程控制 1.1 分支结构 switch语句 1.2 循环结构 while 循环 for循环 循环控制 : 1.3代码示例 前言: 今天我们就开始学习JavaScript里面的运算符和流…

【校招VIP】测试开发之字符串算法

考点介绍: 字符串匹配看起来是个很简单、很成熟的问题,但在很多领域都有着很多的应用,比如模式匹配、特征提取等等。字符串算法是很经典的面试题,既考察了求职者的写用例水平又考察了软件测试求职者的编码水平。 测试开发之字符串…

景联文数据标注:AI大模型在教育和医疗领域的应用

8月31日消息,备受行业瞩目的首批大模型产品获批名单发布,首批通过备案的8家大模型公司分别是:百度(文心一言)、抖音(云雀大模型)、智谱AI(GLM大模型)、中科院&#xff08…

centos7上hive3.1.3安装及配置

1、安装背景; hive是基于hadoop的数据仓库软件,部署运行在linux系统之上,安装之前必须保证hadoop环境运行正常,hive本身不是分布式软件,它的分布式主要是借助hadoop实现,存储是hdfs,计算是mapr…

彻底学会Unity从网上加载资源到场景

使用类WWW 该类实例化的对象可以存储多种多媒体资源,只需要在构造函数中附上可访问的资源链接 Unity 中,WWW 类用于实例化互联网上的资源,如文本、图像、音频和视频等。WWW 实例化的对象可以存储多种多媒体素材。以下是一些常见的例子&…

Kubernetes(k8s) 架构原理一文详解

目录 一、k8s 概述 1.什么是k8s? 2.特性 3.主要功能 三、集群架构与组件 1.Master 组件 (1)Kube-apiserver (2)Kube-controller-manager (3)Kube-scheduler 2.配置存储中心 3.Node 组…

Cell Reports | 揭开METTL14在介导m6A修饰中的神秘面纱

m6A被认为是最丰富的mRNA修饰,广泛分布在大多数真核生物中,包括哺乳动物、植物、昆虫、酵母和某些病毒。m6A修饰的沉积和去除之间的动态平衡对于正常的生物过程和发育至关重要,如失调通常与癌症等疾病有关。m6A修饰由m6A甲基转移酶复合物&…

C++多态案例3----组装电脑含测试代码

案例描述: 电脑主要组成部件为 CPU (用于计算) ,显卡 (用于显示) ,内存条 (用于存储)将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商创建电脑类提供让电脑工作的函数,并且调用…

nc前端合计行、按钮组

nc前端合计行、按钮组 1.无表体和单表体的合计行加法 只要卡片下 如果是只有表头要合计行就只留ShowTotalLine;如果是只有表体要合计行就只留ShowTotalLineTabcodes 2.多表体的合计行加法 表头卡片下和列表下都要 3.档案的合计行加法 重写一下列表模板 …

9.4作业

服务器 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);servernew QTcpServer(this); }Widget::~Widget() {delete ui; }void Widget::on_pushButton_clicked(…

PhpStorm软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 PhpStorm是一款由JetBrains开发的专业PHP集成开发环境(IDE),旨在提供全面的PHP开发支持。它是基于IntelliJ IDEA平台构建的,具有强大的功能和工具,可以帮助开发人员提高…

VIOOVI解析:如何进行工时测定?什么工时测定软件比较准确?

通常来说,在正常的操作条件下,普通且熟练的工人用正常的作业速度完成工作所需要的时间,我们将之称为标准工时。 标准工时的准确性对整个企业的生产经营起着至关重要的作用。错误的工时测定,提供的数据往往会引发企业高层决策上的…

【Java】Java虚拟线程开启preview

JEP 425:虚拟线程(预览版)最近被提出。这是java中一个期待已久的特性。我想试一试。所以我下载了JDK的早期版本,其中包含了这个项目。然而,它还在预览阶段。 SDK19、IntelliJ IDEA Community Edition 2023.1.4 代码: package com.example.…