JavaScript 作用域链

news/2024/7/6 1:19:07

作用域链是什么

   函数在使用一个变量的时候,会查找这个变量,如果自己内部没有,就会向上找,这个查找的过程就叫 作用域链

普通函数的作用域链

1、创建一个函数fn()时,会创建一个包含全局变量的作用域链,保存在该函数的[[scope]]属性中。

2、抵用函数fn()时,为此函数创建一个执行环境。、

3、然后复制函数的scope属性,构建起执行环境的作用域链

3、此后,函数内部创建的活动对象,推入执行环境作用域的前端(【0】位置)

闭包的作用域链

1.内部函数innerfn()创建相对于自己的全局变量作用域链,保存在Scope属性中。

2、对于内部函数而言,外部函数中的活动对象(局部变量)也属于自己的作用域链。

3、及时外部函数执行完毕,但仍然在内部函数的属性(scope 作用域链)中进行引用

     及时外部函数的执行环境/作用域链全部销毁,但是变量还在内存中留着

4、根据 垃圾回收机制,被引用的变量不回回收吗,因此会产生内存泄露

举例 (闭包+使用场景)

function f1() {
    // 被闭包使用
    let n = 100
    
    // 闭包f2
    function f2() {
        n = n + 100 // 作用域链:f2内部没有n,向上一层在f1中查找到n
                    // 每次调用f2的时候,n都会使用上次更改后的值
        console.log(n)
    }
    
    // 返回的是函数f2
    return f2
}
var temp = f1() // temp本质 = f2

temp() // 200 // 本质=f2()
temp() // 300 // 本质=再次f2(),这时候再次对n进行修改。这时获取到的n是200了。 

解决办法:取消引用

temp = null // 取消对闭包(内部函数)的引用

 

 

 

 

 

 


http://www.niftyadmin.cn/n/3655771.html

相关文章

2007微软MVP获得连任

今天早上收到了这封邮件:“[MVP] 热烈祝贺!您已经获得 Microsoft MVP 奖励”,心情还是满不错的,在blog上留个纪念。----------------------------------------------------------------------------------------------尊敬的 Hong…

JavaScript 事件冒泡和事件捕获

什么是事件 JavaScript和HTML之间的交互是通过事件实现的。 事件:就是文档或浏览器窗口发生的一些特定的交互瞬间。 监听器(或事件处理程序):预定事件,以便事件发生时执行相应的代码。 通俗的说,这种模型其…

初涉龙芯I/龙芯II

最近想开发一款高性能的嵌入式多媒体系统,目前Arm9系列的嵌入式平台多媒体性能欠佳。最近龙芯在嵌入式方面投入了很大的精力(毕竟做通用PC,龙芯的性能还是远远不够,目前的性能不过相当于奔腾800),听我们老总…

javaScript 的 splice和slice,map和forEach、 filter()、reduce()的区别

map和forEach 参数:都是(当前值,当前对应的index,当前调用的array) 可以不写全 map 根据每个元素的转换,组成新数组原数组不变返回新数组注意一个笔试题:参考回调函数 ["1", &qu…

.net精简框架集下的ini文件读取(C#)

无论是.net框架集还是.net精简框架集都能非常完美的支持XML文件,并且微软也强烈建议用xml文件取代ini文件,但是在工控领域大部分的工程都是采用ini文件配置的系统信息的。以前的隧道管理系统是采用ini文件配置信息的,为了实现兼容&#xff0c…

什么事堆?什么是栈? 它们之间有什么区别和联系

堆和栈的概念存在于数据结构中和操作系统内存中。 在数据结构中,栈中数据的存取方式为先进后出。 堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。完全二叉树是堆的一种实现方式。 在操作系统中,内存被分…

也谈正则表达式

其实很早就知道了正则表达式,在集成VBScript脚本的时候,就看到了该功能,不过那时觉得很难,觉得也派不上什么用场,所以也没有过多关注。最近看了孟岩老师的关于正则表达式讲解,有一种学习正则表达式的冲动&a…

内部属性[[class]]是什么?

所有的 typeof 返回值为 “object” 的对象(如数组)都包含一个内部属性 [[class]] (我们可以把它看作一个内部的分类),而非传统的面向对象意义上的类)。 这个属性无法直接被访问,一般通过 object。prototype。toStrin…