当前位置: 首页 > news >正文

前端基石:构造函数和普通函数

前言

function Fn() {// ...
}

let f1 = Fn();
let f2 = new Fn(); 

在上面的代码中,一个 Fn 函数有两种命运,普通函数执行,new 构造函数执行。那这两种执行方法有什么区别了?

简单来理解,普通函数执行,是把 Fn 函数执行的结果返回给 f1。构造函数执行,把 Fn 当做一个类,是把创造的一个实例返回,f2 是创造出来的一个实例。

本文将从执行流程中为大家分享这两类函数的区分。

代码执行前奏

全局执行上下文进栈执行

1.初始化变量对象(VO)
2.初始化作用域链<<window, ->>
3.初始化 this
4.初始化 arguments(没有)
5.形参赋值(没有)
6.变量提升,Fn 变量提升,声明 + 定义(let 没有变量提升,所以 f1、f2 不会声明也不会在这个阶段被定义)
7.代码执行

全局上下文代码执行

1.Fn 不做任何操作,在上一步已经被声明+ 定义
2.f1 = Fn(),普通函数执行,函数执行创建一个新的执行上下文进栈执行
3.f2 = new Fn(),构造函数执行,大多数构造函数执行和普通函数执行是一样的,但是有几点不太一样。

为了方便区分,下文中 Fn(f1) 指代的是普通函数 Fn 执行。Fn(f2) 指代的是 new Fn()执行。

普通函数执行

Fn(f1)进栈执行

1.Fn(f1) 私有上下文进栈执行
2.初始化变量对象 AO(f1)
3.初始化作用域链<<EC(f1), EC(G)>>
4.初始化 this
5.初始化 arguments
6.形参赋值
7.变量提升
8.代码执行 …
9.函数由于没有返回,所以默认返回 undefined,f1 被赋值为 undefined ,在全局的 VO(G) 中 f1 = undefined
10.函数执行完成出栈

存储示意图

Fn(f2) 进栈执行

1.Fn(f2) 私有上下午进栈执行
2.初始化变量对象 AO(f2)
3.在构造函数执行,初始化作用域链之前,浏览器会默认先创建一个对象(空对象,Fn 的实例对象)
4.初始化作用域链<<EC(f2), EC(G)>>
5.初始化 this,这里的初始化 this,会将 this 指向第三步创建的对象,所以在后期代码中执行 this.xx = xx 的时候,实际上就是在往这个对象(实例对象)上添加属性或者方法,这里还需要注意下,构造函数执行,函数内部的私有变量和实例是没有关系的。
6.初始化 arguments
7.形参赋值
8.变量提升
9.代码执行
10.**函数执行完,出栈之前,会查看构造函数本身的返回结果:**1.**如果有 「return 对象」,则以返回值为主,f2 就会等于这个返回值对象。**2.如果没有返回值或者返回的是一个原始值,则浏览器默认会将创建的实例返回,f2 就会等于这个实例对
11.函数出栈

存储示意图

总结

JavaScript 这一门语言本身是基于类和实例构建和组成的。当我们将一个函数当做构造函数执行时和普通函数有大致三点不同:

  • 在构造函数执行,初始化作用域链之前,浏览器会默认先创建一个对象(空对象,Fn 的实例对象)。
  • 初始化 this,这里的初始化 this,会将 this 指向第三步创建的对象,所以在后期代码中执行 this.xx = xx 的时候,实际上就是在往这个对象(实例对象)上添加属性或者方法,这里还需要注意下,构造函数执行,函数内部的私有变量和实例是没有关系的。
  • **函数执行完,出栈之前,会查看构造函数本身的返回结果:**1.**如果有 「return 对象」,则以返回值为主,f2 就会等于这个返回值对象。**2.如果没有返回值或者返回的是一个原始值,则浏览器默认会将创建的实例返回,f2 就会等于这个实例对

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

相关文章:

  • 免费企业网站怎么做/新闻软文发稿平台
  • 凡科网做网站好吗/武汉网站关键词推广
  • 京东网站建设的经费预算/推广赚佣金
  • 自己做视频网站会不会追究版权/搜索引擎查关键词排名的软件
  • 广州头条新闻最近一周/搜索引擎优化的概念是什么
  • 网站开发禁止下载功能/重庆高端seo
  • MySQL索引-3回表查询与覆盖索引
  • 【机器学习】阿里云天池竞赛——工业蒸汽量预测(5)
  • 可编程交换机P4网络资源
  • HTTP版本 四次挥手 同源策略
  • fastapi_No.7_获取表单和文件数据
  • YOLOX 学习笔记
  • 6.链表篇2链表的介绍和实现(单/双链表)
  • myj的补作业计划HrbustOJ新生赛(struct+优先队列)
  • Day770.Redis客户端如何与服务器端交换命令和数据 -Redis 核心技术与实战
  • 图像运算和图像增强二
  • 图学习——02.Graph Neural Network
  • Java学习笔记 ---- 类变量和类方法