JavaScript中的执行上下文和原型链

目录

一、执行上下文

1.执行上下文

2.执行上下文栈

3.闭包

1)定义

2)形成条件

3)例子

(1)例子1:简单闭包

(2)例子2:闭包与循环

(3)例子3:使用闭包模拟私有变量

二、原型链

1.定义

2.原型(Prototype)与构造函数(Constructor)

3.原型链使用

1)工作原理

2)使用

(1)设置原型对象

(2)原型链的继承


一、执行上下文

在JavaScript中,每当代码执行时,都会创建一个执行上下文(Execution Context)。执行上下文是JavaScript代码执行时的环境,它决定了代码如何被解析和执行。执行上下文是JavaScript引擎的基础,用于管理代码执行期间的变量、函数等。

1.执行上下文

1)全局执行上下文:在全局作用域中定义的代码会在全局执行上下文中执行。在浏览器中,全局执行上下文是window对象。

2)函数执行上下文:每当调用函数时,都会创建一个新的函数执行上下文,这个上下文包含了函数的局部变量、参数等信息。

2.执行上下文栈

JavaScript引擎使用执行上下文栈(也称调用栈)来管理执行上下文。

当代码执行时,新的执行上下文会被推入栈中;当执行完成后,该上下文会从栈中弹出。

函数调用时会创建一个新的执行上下文,并将其推入栈中,当函数执行完毕后,其执行上下文就会从栈中弹出,继续之前的执行上下文。

例子1:

        function foo() {let x = 1;console.log(x);}let y = 2;foo(); // 输出: 1console.log(y); // 输出: 2

在这个例子中,首先会创建全局执行上下文,并在其中定义变量y,接着foo()函数调用,创建新的执行上下文,并定义变量x,当函数执行完毕后,其执行上下文会从栈中弹出,继续全局执行上下文,进行后续代码。

例子2:

let globalVar = 'I am global';function testGlobalContext() {let localVar = 'I am local';console.log(globalVar); // 访问全局变量console.log(localVar);  // 访问局部变量}testGlobalContext(); // 输出: I am global, I am localconsole.log(globalVar); // 输出: I am global

例子3:

var outerVar = 'I am outside';  function outerFunction() {  var innerVar = 'I am inside';  function innerFunction() {  console.log(outerVar); // 访问外部函数作用域的变量  console.log(innerVar);  // 访问自身作用域的变量  }  innerFunction(); // 调用内部函数  
}  outerFunction(); // 输出: I am outside, I am inside

这个例子中,outerVar是在全局作用域中定义的,而innerVar 是在outerFunction的函数作用域中定义的。innerFunction能够访问到 outerVar,是因为它位于outerFunction的作用域之内(即 outerFunction的执行上下文在 innerFunction执行时仍然存在于调用栈上)。

例子4:

function first() {  second();  console.log('First function');  
}  function second() {  third();  console.log('Second function');  
}  function third() {  console.log('Third function');  
}  first(); // 调用顺序:first -> second -> third -> second -> first

结果:

3.闭包

1)定义

闭包(Closure)是一个函数值,它引用了其外部的作用域(词法作用域)中的变量。即使函数是在其外部作用域之外执行,它仍然可以访问那些变量。

  • 封装私有变量,变量只能通过特定的函数接口进行访问和修改,有助于保护数据不被外部随意访问。

  • 创建模块:闭包可以模拟模块的概念,实现模块的封装和隐藏实现细节。通过这种方式,可以将相关的函数和数据组织在一起,只暴露必要的接口给外部使用。

  • 回调函数和异步编程:在JavaScript中,闭包常用于处理回调函数和异步编程。

通俗解释:

现在有一个大房间(外部函数),里面有一个小盒子(局部变量),小盒子里放了一些东西(变量的值),还有一个能够进入这个大房间的门(外部函数的调用),但是这个房间里面的东西(包括小盒子)我们不能直接从房间外面看到或拿到。

这时,在房间里设置一个窗口(内部函数),通过这个窗口,可以把小盒子里的东西展示给房间外面的人看,或者允许修改小盒子里的东西。这个窗口加上它能看到的小盒子里的东西,以及它所在的房间,就构成了一个闭包。

2)形成条件

(1)函数嵌套

(2)内部函数引用了外部函数的变量

(3)内部函数被执行

3)例子

(1)例子1:简单闭包
// 外部函数,大房间function outerFunction() {var secret = "我是房间里的小盒子放的东西";// 内部函数,窗口function innerFunction() {// 通过内部函数(窗口)可以获取到小盒子里的东西console.log(secret);}return innerFunction; // 返回内部函数,形成闭包}var myClosure = outerFunction(); // 调用外部函数,此时不执行内部函数myClosure(); // 通过闭包访问外部函数的局部变量,输出: 我是房间里的小盒子放的东西
(2)例子2:闭包与循环
// 使用闭包来捕获每次循环的i值function createFunctionsFixed() {let result = [];for (let i = 0; i < 5; i++) {result.push((function(x) {return function() {return x; // 使用闭包捕获的x值};})(i)); // 立即执行函数表达式,将当前的i值作为参数x传递给内部函数}return result;}let functionsFixed = createFunctionsFixed();for (let k = 0; k < functionsFixed.length; k++) {console.log(functionsFixed[k]()); // 输出0, 1, 2, 3, 4}

解析:

(function(x) {  return function() {  return x; // 使用闭包捕获的x值  };  
})(i)

这个函数是一个立即执行函数表达式(IIFE)。

(立即执行函数表达式,具体参考:

JavaScript之深入理解立即调用函数表达式(IIFE),你对它的理解,决定了它的出镜率(系列六)-CSDN博客)

它的作用是立即执行并传递当前循环的 i 值作为参数 x 给内部函数,它创建了一个新的作用域,其中 x 是作为参数传入的 i 值的副本。

内部函数function使用闭包捕获x的值(即 i 值),使得可以在作用域外访问到 i 的值。

结果:

(3)例子3:使用闭包模拟私有变量
function Counter() {let privateCount = 0; // 私有变量function changeCount(value) {privateCount += value; // 修改私有变量的值}return {increment: function() {changeCount(1); // 增加计数return privateCount;},decrement: function() {changeCount(-1); // 减少计数return privateCount;},getCount: function() {return privateCount; // 获取当前计数值}};}let myCounter = Counter(); // 创建一个计数器实例console.log(myCounter.getCount()); // 输出: 0myCounter.increment(); // 增加计数console.log(myCounter.getCount()); // 输出: 1myCounter.decrement(); // 减少计数console.log(myCounter.getCount()); // 输出: 0

这个例子中,Counter函数创建了一个包含私有变量privateCount的作用域,它返回了一个对象,该对象包含三个方法:increment,decrement,getCount,这些方法都可以被访问和修改。

二、原型链

1.定义

原型链是由多个原型对象通过__proto__属性连接起来形成的一种链式结构,它描述了对象之间或函数之间的原型继承关系,实现了继承和共享属性,使得对象能够继承其父对象或更上层父对象的属性和方法。

2.原型(Prototype)与构造函数(Constructor)

  • 每个函数都有一个prototype属性,这个属性是一个普通的对象,即函数的原型对象。
  • 通过new关键字创建的实例对象,会包含一个指向其构造函数原型对象的内部链接(通常通过__proto__属性访问,但__proto__不是标准属性,应使用Object.getPrototypeOf()方法)。

3.原型链使用

1)工作原理

(1)查找属性:当访问一个属性或方法时,js会首先在对象本身中查找,如果对象本身没有该属性,则会沿着原型链向上查找,直到找到原型链的顶端(通常是0bject.prototype,它的__proto__属性为null)。

(2)继承属性:原型链允许对象继承另一个对象的属性和方法,这是通过将对象的__proto__属性指向另一个对象的prototype属性来实现的。当访问对象的属性时,如果对象本身没有该属性,则会到原型对象中查找。

2)使用

(1)设置原型对象

在构造函数中,可以通过设置其prototype属性来定义实例对象可以继承的属性和方法。

例子:

function Person(name) {this.name = name;}Person.prototype.greet = function() {console.log('Hello, my name is ' + this.name);};let person1 = new Person('Alice'); // 继承属性// person1 的 __proto__ 指向 Person.prototype// 因此在person1中本身没有这个方法,但通过原型链向上查找,可以访问 Person.prototype 上的 greet 方法person1.greet(); // 输出: Hello, my name is Alice

该例子中的原型链是:person1 -> Person.prototype -> Object.prototype -> null

(2)原型链的继承

如果一个对象A的原型(prototype )是另一个对象B,那么A就能继承B的属性和方法。

可以通过将子类的prototype 设置为父类的一个实例来实现继承。

例子:

// Bfunction Parent() {this.parentProperty = true;}// B的原型prototype设置Parent.prototype.getValue = function() {return this.parentProperty;};// Afunction Child() {this.childProperty = false;}// 继承SuperType,A的原型是B对象(子类的原型prototype是父类的一个实例),A可以访问B的方法Child.prototype = new Parent();let instance = new Child();console.log(instance.getValue()); // true

补充:

原型链条的使用以及使用原型链条操作数组的方法_原型链使用-CSDN博客

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

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

相关文章

mes系统在新材料行业中的应用价值

万界星空科技新材料MES系统是针对新材料制造行业的特定需求而设计的制造执行系统&#xff0c;它集成了生产计划、过程监控、质量管理、设备管理、库存管理等多个功能模块&#xff0c;以支持新材料生产的高效、稳定和可控。以下是新材料MES系统的具体功能介绍&#xff1a; 一、生…

【算法入门-栈】逆波兰表达式求值

&#x1f4d6;逆波兰表达式求值 ✅描述✅扩展&#xff1a;什么是逆波兰表达式✅题解方法一&#xff1a;栈✅题解方法二&#xff08;数组模拟栈&#xff09; 今天又刷了一道题&#xff0c;奥利给 刷题地址&#xff1a; 点击跳转 ✅描述 给定一个逆波兰表达式&#xff0c;求表达…

吹田电气绿色能源 未来可期

在2024年7月的上海慕尼黑电子展上&#xff0c;吹田电气功率分析仪成为了备受瞩目的明星产品。作为电子测试与测量领域的重要工具&#xff0c;功率分析仪在展会上展示了其在绿色能源和高效能量管理方面的最新应用&#xff0c;引发了广泛关注和热议。 领先技术&#xff0c;精准测…

[leetcode]kth-smallest-element-in-a-sorted-matrix 有序矩阵中第k小元素

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;…

Qt/QML学习-PathView

QML学习 PathView例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")color: "black"PathView {id: pathViewanchors.fill: parentmodel: ListModel {List…

电厂数字孪生能源数据可视化运维平台开发炫酷且性价比更高

3D数据可视化大屏平台是我们为工厂车间提供的线上展示自定义工具&#xff0c;深度融合了web3D开发建模、AI和图形图像技术&#xff0c;完美还原车间产线布局&#xff0c;让复杂的生产流程和设备运行数据在大屏上直观呈现。 3D可视化数据大屏采用全景3D视角和虚拟现实技术&#…

快速测试electron环境是否安装成功

快速测试electron环境是否安装成功 测试代码正确运行的效果运行错误的效果v22.4.1 版本无法使用v20.15.1版本无法使用v18.20.4 版本无法使用 终极解决办法 测试代码 1.npx create-electron-app my-electron-app 2.cd my-electron-app 3.npm start 正确运行的效果 环境没问题…

springboot高校讲座预约管理系统-计算机毕业设计源码21634

摘 要 本系统旨在设计和实现一个基于Android平台的高校讲座预约管理系统&#xff0c;以提供管理员和普通用户便捷的讲座预约服务和全面的管理功能。系统将包括在线讲座发布、讲座预约、座位安排、签到信息记录等功能模块&#xff0c;旨在提高高校讲座活动的组织效率和用户体验。…

【三维向量旋转】基于Matlab的三维坐标旋转

一、问题描述 若空间中存在三个点A,B,C&#xff0c;其中A点是不动点&#xff0c;B点是当前方向向量上的一个点&#xff0c;C是目标方向上的一个点。如果要让AB向量沿着BC方向进行旋转&#xff0c;使得AB最终旋转到AC。这个过程就是三维向量的旋转过程。我们关注的是这个过程&am…

MT3047 区间最大值

思路&#xff1a; 使用哈希表map和set&#xff08;去重&#xff09;维护序列 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e5 10; int n, k, A[N]; map<int, int> mp; // 元素出现的次数 set<int> s; // 维护出现…

【案例】python集成OCR识别工具调研

目录 一、前言二、Tesseract_OCR2.1、安装过程2.2、python代码使用三、PaddleOCR3.1、安装过程3.2、python代码使用四、EasyOCR五、ddddOCR六、CnOCR一、前言 因项目需要OCR识别能力,且要支持私有化部署。本文将对比市场一些开源的OCR识别工具,从中选择适合项目需要的OCR,且…

Win10屏幕录制,这3种方法分享给你

数字化时代里&#xff0c;电脑的屏幕录制功能已经不再是简单的工具&#xff0c;而是成为我们表达、学习和交流的重要媒介。Win10系统依然是大部分人使用的电脑系统&#xff0c;那么关于Win10屏幕录制&#xff0c;有哪些好用高效的录制软件&#xff0c;能够帮助我们更加深入地捕…

美国商超入驻Homedepot,会成为传统家织厂家跨境赛道吗?

近年来&#xff0c;随着全球化步伐的加快和电子商务的蓬勃发展&#xff0c;越来越多的企业开始寻求跨境拓展的机会。在这样的背景下&#xff0c;美国知名的家居用品零售商超——Homedepot成为了许多国内外家织厂家关注的焦点。那么&#xff0c;美国商超入驻Homedepot究竟如何呢…

短视频剪辑软件-剪映必备快捷键大全 沈阳短视频剪辑培训

对于用剪映电脑版的朋友来说 快捷键是很重要的 那么剪映专业版有哪些快捷键呢 今天总结了一下快捷键大全 赶快收藏吧 1、基础功能 复制&#xff1a;Ctrl&#xff0b;C 粘贴&#xff1a;Ctrl&#xff0b;v 分割&#xff1a;Ctrl B 删除&#xff1a;Back 新建草稿&…

15.x86游戏实战-汇编指令jmp call ret

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

webGL可用的14种3D文件格式,但要具体问题具体分析。

hello&#xff0c;我威斯数据&#xff0c;你在网上看到的各种炫酷的3d交互效果&#xff0c;背后都必须有三维文件支撑&#xff0c;就好比你网页的时候&#xff0c;得有设计稿源文件一样。WebGL是一种基于OpenGL ES 2.0标准的3D图形库&#xff0c;可以在网页上实现硬件加速的3D图…

985研究生8年终毕业,学位证颁发11天后被作废?

“正常是学校颁证给学院&#xff0c;但学院就没告诉我&#xff0c;还把学校颁发的证书给撤销了&#xff0c;这中间学院并没有书面或电话告知我本人。”34岁读研&#xff0c;如今已42岁的内蒙古任女士回想起求学不易&#xff0c;很是心酸。 2015年3月&#xff0c;任女士考取2015…

【ffmpeg系列二点五】(失败,建议放弃)ubuntu下进行源码构建,给ffmpeg7.0.1添加hevc支持。

背景 windows下构建失败&#xff0c;ffmpeg对于flv-h265的处理得到新的报错。 开始ubuntu22下编译 pre&#xff1a;清除我们之前编译的nightly版本 sudo rm -rf /usr/local/bin/ffmpeg sudo rm -rf /usr/local/bin/ffprobe sudo rm -rf /usr/local/bin/ffserver sudo rm -…

3D线上展示技术如何应用到汽车营销中?有哪些优势?

传统的汽车销售主要是通过实体店面展示汽车&#xff0c;但这样的展示方式成本高昂&#xff0c;而且还有空间限制。近年来&#xff0c;随着互联网的不断发展&#xff0c;线上看车逐渐成为当下年轻消费群体的看车新选择&#xff0c;并且线上看车正在从2D平面转向3D立体体验。 一、…

Phospho:LLM应用的文本分析利器

今天向大家介绍phospho文本分析平台&#xff0c;专门为大型语言模型&#xff08;LLM&#xff09;应用程序设计。它可以帮助开发者从用户或应用程序的文本消息中检测问题、提取洞见、收集用户反馈&#xff0c;并衡量成功。作为一个开源项目&#xff0c;phospho允许开发者查看和修…