delphi 函数内创建对象 释放_JavaScript 的函数底层运行机制

▲ 点击上方蓝字关注我 ▲文 / 景朝霞来源公号 / 朝霞的光影笔记ID / zhaoxiajingjing图 / 自己画

目录0 / 题(1)第一题(2)第二题1 / 引用数据类型:object2 / 引用数据类型:function(1)第二题,简图(2)创建函数(3)执行函数(4)闭包3 / 练习题(1)第一题(2)第二题(3)第三题

0 / 题

(1)第一题
 var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b);

△ 引用数据类型:object

(2)第二题
 var x = [12, 23]; function fn(y) {     y[0] = 100;     y = [100];     y[1] = 200;     console.log(y); } fn(x); console.log(x);

△ 引用数据类型:function

这些题是不是很简单?我们主要看逻辑:

1 / 引用数据类型:object

在Web浏览器中执行JS代码,会开辟一块栈内存来作为执行环境:ECStack(Execution Context Stack)

会开辟一块栈内存供全局代码执行:全局执行上下文 EC(G)(Execution Context Global),还有其他的上下文:函数私有执行上下文、块级私有上下文…… 自己管好自己那一摊的代码执行内容

形成的执行上下文都会 进栈 到执行环境栈中运行.私有上下文会在不被占用时出栈释放,浏览器的回收机制GC.当浏览器关闭时,全局执行上下文就会出栈释放了

△ 图2.1_第一题,简图

GO:全局对象 Global Object ,并不是VO(G)全局变量对象 Variable Object Global

全局对象,它是个对象,它就是个堆内存,浏览器打开一加载页面就默认开辟的堆内存。

浏览器提供的一些供JS调用的API,在Web浏览器中,全局对象可以通过window来访问的

 注意:运算符优先级,要多看看多比划比划

注意基本数据类型值直接存储在栈内存中,引用数据类型值存在堆内存

2 / 引用数据类型:function

 var x = [12, 23]; function fn(y) {     y[0] = 100;     y = [100];     y[1] = 200;     console.log(y); } fn(x); console.log(x);

△ 函数执行

(1)第二题,简图

△ 图2.2_函数执行

△ 图2.3_数组的格式:键值对

(2)创建函数

创建函数的步骤:【和创建变量区别不是很大,函数名就是变量名】

① 单独开辟一个堆内存:16进制地址,函数堆内存中存储的是函数体中的代码字符串

② 创建函数的时候,就声明了它的作用域[[scope]],也就是所在的上下文环境

③ 把16进制地址(16进制以0x开头)存放到栈中,供函数名变量名关联引用即可

只创建函数,不执行函数,没啥意义,那就是一堆字符串。

函数执行的目的:把创建函数的时候在堆内存中存储的 代码字符串 变为代码执行

代码执行一定会有一个执行的环境,它的上级执行上下文,是函数创建的地方

函数执行会形成一个全新的、私有的执行上下文,在私有上下文中,也有存放自己变量的对象:AO(Active Object 活动对象),它是VO的一种。

变量对象: ① 在全局上下文中:VO  ② 在私有上下文中:AO

实参都是值。形参是变量。

fn(x):执行函数fn,把全局上下文中存储的x变量关联的值(0x000001),作为实参传递给函数的形参变量

(3)执行函数

执行函数做了哪些事情:

1、形成了一个全新的、私有的执行上下文EC(xxx)

2、当前私有的上下文中,有一个存放此上下文内声明的变量的地方 AO(xxx) 私有变量对象

① 形参变量

② 当前上下文中声明的变量

3、进栈执行

4、代码执行之前还要处理很多事情:

① 初始化作用域链

[[scope-chain]]:

(作用域链有两头,一头是自己执行的上下文,另一头是自己创建时所在的上下文)

即:当前函数的上级上下文是创建函数所在的上下文,就是作用域

以后再遇到函数内的代码执行,遇到一个变量,首先看是否为自己上下文中的私有变量(看AO中有没有,有,是自己私有的;没有,不是自己私有的)。如果是私有的变量,则当前变量的操作和外界环境中的变量互不干扰(没有直接关系);如果不是自己的私有变量,则按照作用域链,查找是否为其上级上下文中的私有变量.....一直找到EC(G)全局上下文为止:作用域链查找机制

② 初始化this....

③ 初始化arguments....

④ 形参赋值:形参都是私有变量,放在AO中的。如果不传递实参,默认值是undefined

⑤ 变量提升....

5、代码自上而下执行

6、.....

7、一般情况下,函数执行所形成的私有上下文,进栈执行完后,会默认出栈释放掉

【私有上下文中存储的私有变量和一些值都会被释放掉,目的:为了优化内存空间,减少栈内存的消耗,提高页面或者计算机的处理速度......】

不能出栈释放:当前上下文中某些内容(一般是堆内存地址)被当前上下文的外部的事物占用了,则无法出栈释放。一旦被释放,后期外部事物就无法找到对应的内容了

注意:多次函数执行,会形成多个全新的、私有执行上下文,这些上下文之间没有直接的关系

(4)闭包

一般,很多人认为:大函数返回小函数是闭包。

这只是闭包机制中的一种情况。

闭包:函数执行形成一个私有的执行上下文,此上下文中的私有变量,与此上下文以外的变量互不干扰;也就是当前上下文把这些变量保护起来了,我们把函数的这种保护机制称为闭包。

闭包不是具体的代码,而是一种机制。

一般情况下,形成的私有上下文很容易被释放掉,这种保护机制存在时间太短了,不是严谨意义上的闭包。有人认为,形成的上下文不被释放,才是闭包。此时,不仅保护了私有变量,而且这些变量和存储的值也不会被释放掉,保存起来了。

闭包的作用:① 保护 ② 保存

利用闭包的两个作用,可以实现高阶编程技巧,以后再说~

3 / 练习题

(1)第一题
 var x = 100; function fn() {     var x = 200;     return function(y) {         console.log(y + x++);    } } var f = fn(); f(10); f(20);

△ 第一题

i++ 后加

△ 图2.4_后加

(2)第二题
 let a=0,     b=0; function A(a){     A=function(b){         alert(a+b++);    };     alert(a++); } A(1); A(2);

△ 第二题

(3)第三题
 let x = 5; function fn(x) {     return function(y) {         console.log(y + (++x));    } } let f = fn(6); f(7); fn(8)(9); f(10); console.log(x);

△ 第三题

- end -

从“”到“更好的你

有无限可能

好啦,好啦,碎碎念了很多:

全局执行上下文、创建函数、作用域、执行函数、私有执行上下文、AO和VO、实参、形参、作用域链

△ 图2.5_练习题,第一题

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

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

相关文章

Unity3D学习笔记之五为Prefab添加材质

本次笔记中,我们将利用unity来创建并使用材质,把材质添加到我们的Prefab中去。这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程《Unity游戏引擎的基础入门视频教程》,下载链接附在第二篇学习笔记中。继续上次笔记中所记录的东西&a…

分布式版本控制系统之Git

Git Git 是目前世界上最先进的分布式版本控制系统(没有之一)作用 源代码管理为什么要进行源代码管理? 方便多人协同开发方便版本控制Git的诞生 作者是 Linux 之父:Linus Benedict Torvalds当初开发 Git 仅仅是为了辅助 Linux 内核的开发&…

oo第三次博客-JML规格

这三周的作业主要是围绕以JML来约束代码开发,以确保程序的正确性与鲁棒性。 Part 1:三次作业的实现与bug 第一次作业没有任何算法和数据结构上的难度,对于Path和PathContainer的各个方法的实现按照给出的规格复读即可。唯一的难点&#xff08…

Kinect开发笔记之一Kinect详细介绍

毕业设计的课题我选择了结合Kinect和Unity3D开发体感游戏,这是我十分感兴趣的一个课题,所以做好当然责无旁贷。准备再写一系列Kinect的学习笔记,记录自己毕设一步一个脚印的历程。1、Kinect背景介绍众所周知,Kinect是一款集成了很…

获取2个地址之间的距离(高德API)

2019独角兽企业重金招聘Python工程师标准>>> string startLonLat SiteHelper.GetLonLat("大连"); //获取起始地经度纬度 string endLonLat SiteHelper.GetLonLat("沈阳"); //获取目的地经度纬度 int distance SiteHelper.GetDistance(star…

WPF属性学习

一.WPF属性系统 CLR属性 .NET中的属性称为CLR属性 转载于:https://www.cnblogs.com/programme-maker/p/10910166.html

chemdraw怎么连接两个结构_利用神经结构搜索构建快速准确轻量级的超分辨率网络...

介绍我们知道,把神经网络拆解,可以把它归结为几个元素的排列组合而成,例如,以卷积神经网络为例,其主要由卷积层,池化层,残差连接,注意力层,全连接层等组成,如…

Unity3D学习笔记之六创建更多的Prefab

在写完第五篇后,因为不知名的原因,我突然不能够上传100KB以上的图片在博客中了。等了几天还是这样,所以我用PS把图片的分辨率一张张调低,让图片的大小都在100左右,将积攒了四篇的学习笔记一起发上来,也算弥…

iOS底层探索(二) - 写给小白看的Clang编译过程原理

iOS底层探索(一) - 从零开始认识Clang与LLVM 写在前面 编译器是属于底层知识,在日常开发中少有涉及,但在我的印象中,越接近底层是越需要编程基本功,也是越复杂的。但要想提升技术却始终绕不开要对底层原理的探究,很多资…

四、构建Node Web程序

---恢复内容开始--- 一、HTTP 服务器的基础知识 1、Node如何向开发者呈现HTTP请求 2、一个用“Hello World”做响应的HTTP服务器 它用了默 认的状态码200(表明成功)和默认的响应头 3、读取请求头及设定响应头 Node提供了几个修改HTTP响应头的方法&#x…

datagrid 什么时候结束编辑_2020年中考结束后,什么时候出分?什么时候报志愿?...

导语7月19日下午16:00,2020年北京中考正式落下帷幕。考试结束后,很多家长和考生都会长舒一口气,但北京中考在线团队提醒你,现在还不是放松的时刻,中考结束后,还有成绩查询和填报志愿等重要事件等着你。那么…

Unity3D学习笔记之七创建自己的游戏场景

到现在为止我们已经拥有了比较完备的Prefab,已经可以创建宏大的游戏场景,并以第一人称视角在场景中漫游了。这里给大家做个小的示范,建一个小场景大家在创建场景的时候需要自由发挥,做个尽量大的场景出来。这一系列教程以及素材均…

excel if in函数_【Excel函数】Small+Index+IF 一对N返回

通常情况下,Vlookup和lookup函数只能返回满足条件的第一个,剩余的都不会返回。 这也是其函数的一个弊端之一。 若是按照条件,返回所有满足条件的数据(1->N)的,可是适用组合函数。 Index返回位置&#xf…

Unity3D学习笔记之八为场景添加细节(一)

这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程《Unity游戏引擎的基础入门视频教程》,下载链接附在第二篇学习笔记中。我花了30分钟做了一个中等大小的迷宫场景,不知道大家自己发挥,做的场景大小如何。在完成场景之后&#xff0c…

mysql数据库表的管理(增删改)

表字段管理1. 添加到末尾alter table 表名 add 字段名 数据类型;2 添加到开头alter table 表名 add 数据类型 first;3. 添加到指定位置alter table 表名 add 新字段名 数据类型 after 原有字段名;4. 删除字段alter table 表名 drop 字段名;5. 修改数据类型alter ta…

哪个app最费电_微波炉和烤箱,买哪个划算?

微波炉和烤箱不能说买哪个划算,而是看哪个更适合?我家微波炉和烤箱两个都有,所以这个问题我来回答一下。虽然外形上看起来,微波炉和烤箱似乎没有多大的区别,从功能上看,它们也都是加热,但它们侧…

MATLAB数值计算与符号运算

符号计算 存放的是精确数据,耗存储空间 ,运行速度慢,但结果精度高; 数值计算则是以一定精度来计算的,计算结果有误差,但是运行速度快。转载于:https://www.cnblogs.com/shawnchou/p/10927680.html

Unity3D学习笔记之九为场景添加细节(二)

上节为场景中添加了第一块带有碰撞器的石头,本节我们来利用Prefab,将场景细节都添加进去,并且做的更完善。这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程《Unity游戏引擎的基础入门视频教程》,下载链接附在第二篇学习…

vux Cell组件

Cell 组件一 <style lang"scss">.cell {padding-top: 15px;padding-bottom: 15px;color: #333;img {display: block;margin-right: 15px;}} </style><template><Group><cell class"cell" title"钱包" :border-intent…

wifi名称可以有空格吗_收购公司后可以变更公司名称吗,变更公司名称和股权如何处理?...

【点击文末小程序&#xff0c;免费咨询法律问题】公司收购是指二手设备收购&#xff0c;指向目标公司的二手设备&#xff0c;废旧物资&#xff0c;进而获取目标公司的全部或部分业务&#xff0c;取得对拆除的控制权。那么&#xff0c;收购公司后可以变更公司名称吗&#xff0c;…