美文网首页
函数底层

函数底层

作者: Allan要做活神仙 | 来源:发表于2019-03-14 12:01 被阅读0次

函数出现的目的

函数是迄今为止发明出来的用于节约空间和提高性能的最重要的手段。

PS: 注意,没有之一。

函数的执行机制

执行一个函数,会发生什么?

function say() {
  let str = 'hello world'
  console.log(str)
}

从创建函数到执行函数以及其底层实现,这三个层次进行分析:

创建函数

第一步:我要开辟一个新的堆内存

为什么呢?因为每个字母都是要存储空间的,只要有数据,就一定得有存储数据的地方。而计算机组成原理中,堆允许程序在运行时动态地申请某个大小的内存空间,所以你可以在程序运行的时候,为函数申请内存。

第二步:我创建一个函数 say ,把这个函数体中的代码放在这个堆内存中。

想一下函数体是以什么样的形式放在堆内存中的?很明显,是以字符串的形式。
为什么呢?我们来看一下 say 函数体的代码是什么,如下:

let str = 'hello world'
console.log(str)
你觉得这些语句以什么形式的结构放在堆内存中比较好呢,不用考虑也是字符串,因为没有规律。如果是对象的话,由于有规律,可以按照键值对的形式存储在堆内存中。而没规律的通常都是变成字符串的形式。

第三步:在当前上下文中声明 say 函数(变量),函数声明和定义会提升到最前面

开始执行函数

第一步:会形成一个供代码执行的环境,也是一个栈内存

第二步:将存储的字符串复制一份到新开辟的栈内存中,使其变为真正的 JS 代码

第三步:先对形参进行赋值,再进行变量提升,比如将 var function 变量提升。

谈谈底层实现

1、函数的调用和执行在栈中执行,堆中存放函数体内的代码(一堆字符串)

2、计算机中最本质的闭包解释?

函数在 执行 的时候,都会形成一个全新的 私有作用域 ,也叫 私有栈内存

目的有如下几点:

第一点:把原有堆内存中存储的字符串变成真正的 JS 代码

第二点: 保护该栈内存的私有变量不受外界的干扰

函数执行的这种保护机制,在计算机中称之为 **闭包 **。

3、栈内存是怎么分配出来?
首先,你要明白 JS 的栈内存是系统自动分配的,大小固定。想一想,如果自动适应的话,那就基本不存在除死循环这种情况之外的的栈溢出了。

相关文章

网友评论

      本文标题:函数底层

      本文链接:https://www.haomeiwen.com/subject/hfjjuqtx.html