函数杂谈:函数、变量、对象、作用域、内存空间

0 阅读3分钟

函数本身是一个引用类型的数据,一定程度上与对象是一样的,从堆内存的引用这一点来看,函数和对象在内存本质上一个东西,但是函数是可执行的,而对象不可,但是并没有什么区别,而本次仅讨论,匿名函数、命名函数的作用域链是什么东西,从数据的角度去分析函数调用时,其作用域链的形成关系,以及this指向的内容

2022.7.20

昨天的时候刷到一个视频,说new一个普通函数,返回的是一个空对象,这个空对象就是this, 那么再次验证了,函数本质上是一个和对象同级的堆内存空间,内部存储的也是一些变量,和数据,这里要区别一下,函数(普通函数和构造函数是一样的)new出来的对象,是堆内存中一个新的内存空间,那匿名函数呢?

匿名函数的使用场景通常是将其赋值or随地创建,如果是赋值时使用,匿名函数的内存地址通常都是赋给对应的变量(这个变量可以是全局对象中,也可以是局部对象中,对堆内存而言,我不知道每一个内存空间是不是有所属的,是不是根据定义的位置有所限定,但是如果内存地址在定义或开辟的时候,是和定义的地方强绑定的,那这样就跟调用的this指向丢失冲突了,但是这样就解释得通作用域的定义了,作用域链是创建的时候就确定还是调用的时候确定呢?)(静态作用域链是在创建的时候就确定的

2022.7.22

那随地创建的情况呢?

从函数的作用域定义的角度来看,函数的内存地址和其初始时的定义位置(静态代码解析时、词法作用域) 是有关的,也就是说,堆内存是有所属(和namespace有关系吗)的, 此外,在一个构造函数中定义一个变量,和定义一个具名函数,在调用上是一样的,调用一个函数和调用一个常量变量在数据层面是一样的,但是变量不可执行,但是函数可执行一样,在构造函数中定义一个变量时,就是将一个常量数据保存在在这个内存空间中了,如果是定义一个函数呢?是单纯的将函数的堆内存地址保存在这个内存空间中呢?还是将整个函数的内存也嵌入到这个构造函数的内存中来了?他们同属这个构造函数的命名空间中?但是这样子又显然违背堆内存地址的定义,以堆内存地址名称来看,所有的堆内存对象都是同级,函数变量的内存地址和引了它的构造函数是平级的

但是这样的话,如何解释作用域和作用域链呢?又回到了上一个问题: 作用域链是创建的时候就确定还是调用的时候确定呢?红宝书上说作用域链本身是一个对象

this 在任何情况下都不指向函数的词法作用域

“词法作用域是由你在写代码时将变量和块作用域写在哪来决定的”

“调用栈就相当于函数的调用链(动态作用域链),和作用域链有异曲同工之妙”