前端进阶--深入理解JavaScript

2023-09-21 22:56:00

1、JS的作用域和作用域链

  • 作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,我们可以访问到外层环境的变量和函数。
  • 作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个包含了执行环境中所有变量和函数的对象。作用域链的前端始终都是当前执行上下文的变量对象。全局执行上下文的变量对象(也就是全局对象)始终是作用域链的最后一个对象。
  • 当我们查找一个变量时,如果当前执行环境中没有找到,我们可以沿着作用域链向后查找。

2、函数表达式和函数申明

函数声明存在变量提升,会被提升到作用域最前面。
函数表达式,不会被提升,仍然按照从上往下读取。
函数的4种类型:函数声明、箭头函数、函数表达式、函数对象

// 1️⃣:函数声明
async function fn() {
  await f()
}
// 2️⃣:函数表达式
const fn = async function () {
  await f()
};
// 3️⃣:箭头函数
const fn = async () => {
  await f()
};
// 4️⃣:async函数定义在对象中
const obj = {
  async fn() {
      await f()
  }
}

3、原型,原型链

参考阅读: 深入理解JavaScript5:强大的原型和原型链
当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是 Object.prototype 所以这就是我们新建的对象为什么能够使用 toString() 等方法的原因。
在这里插入图片描述

4、this指向及apply call bind 的区别

this ,函数执行的上下文,可以通过 apply , call , bind 改变 this 的指向。对于匿名函数或者直接调用的函数来说,this指向全局上下文(浏览 器为window,NodeJS为 global ),剩下的函数调用,那就是谁调用它, this 就指向谁。当然还有es6的箭头函数,箭头函数的指向取决于该箭头函 数声明的位置,在哪里声明, this 就指向哪里。

5、变量提升

推荐阅读:深入理解JavaScript系列:变量对象Variable Object
当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行环境中,函数中的代码会产生函数执行环境。在生成执行环境时,会有两个阶段。第一个阶段是创建的阶段,JS 解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined ,所以在第二个阶段,也就是代码执行阶段,我们可以直接提前使用

6、JS的继承

原型链继承、借用构造函数继承、组合继承(组合原型链继承和借用构造函数继承)(常用)、原型式继承、寄生组合式继承(常用)
推荐阅读:JS继承的6种方式

7、new操作符具体干了什么呢

  • 1、创建了一个空的js对象(即{})
  • 2、设置原型,将对象的原型设置为函数的 prototype 对象
  • 3、将空对象作为构造函数的上下文(改变this指向)
  • 4、判断构造函数的返回值类型,如果是值类型,则返回新对象。如果是引用类型,就返回这个引用类型的对象
/*   create函数要接受不定量的参数,第一个参数是构造函数(也就是new操作符的目标函数),
其余参数被构造函数使用。   
new Create() 是一种js语法糖。我们可以用函数调用的方式模拟实现 */
function create(Con,...args){    
//1、创建一个空的对象    
 let obj = {}; // let obj = Object.create({});     
//2、将空对象的原型prototype指向构造函数的原型     
Object.setPrototypeOf(obj,Con.prototype); // obj.__proto__ = Con.prototype     
//3、改变构造函数的上下文(this),并将剩余的参数传入    
 let result = Con.apply(obj,args);    
//4、在构造函数有返回值的情况进行判断     
return result instanceof Object?result:obj;}

这里需要注意对构造函数返回值的判断
在new的时候,会对构造函数的返回值做一些判断:
1、如果返回值是基础数据类型,则忽略返回值;
2、如果返回值是引用数据类型,则使用return 的返回,也就是new操作符无效

8、闭包的概念及应用和缺陷

推荐阅读:深入理解JavaScript系列:闭包(Closures)

9 、箭头函数

箭头函数以及和普通函数的区别

10、事件循环 eventLoop 宏任务 微任务

JavaScript事件循环与实践应用

11、Promise async await Promis.all 和 Promic.race的区别

Promise对象与宏任务、微任务

12、ES6语法

阮一峰 ECMAScript 6入门

13、global对象、window对象、document对象

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

  • 堆和栈的概念存在于数据结构中和操作系统内存中。
  • 在数据结构中,栈中数据的存取方式为先进后出。而堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。完全
  • 二叉树是堆的一种实现方式。 在操作系统中,内存被分为栈区和堆区。
  • 栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  • 堆区内存一般由程序员分配释放,若程序员不释放,程序结束时可能由垃圾回收机制回收。

15、如何将浮点数点左边的数每三位添加一个逗号

function format(number) {
  return number && number.replace(/(?!^)(?=(\d{3})+\.)/g, ",");
}

16、JavaScript 常用函数图解

在这里插入图片描述

17、 prototype、__proto__与constructor

  1. 我们需要牢记两点:
    ①__proto__和constructor属性是对象所独有的;
    ② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。
  2. __proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,然后返回undefined,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链
  3. prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.proto === Foo.prototype
  4. constructor属性的含义就是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function

18、import动态引入

/** moduleA.ts */
export default function testA() {
  console.log('this is A');
  const name = 'testA';
  return name;
}


/** moduleB.ts */
export default function testB() {
  const name = 'testB';
  console.log('this is B');
  return name;
}


/**main.vue*/
import testA from './moduleA';
onMounted(() => {
  testA();
  // 动态引入moduleB
  import('./moduleB').then(module => {
    module.default();
    console.log('log内容testb', module.default.name);
  });
  console.log('log内容testA', testA.name);
});
/**输出
this is A
log内容testA testA
this is B
log内容testb testB
*/
更多推荐

如何通过一键导出导入数据实现批量重命名文件名称

在日常办公中,我们经常需要对大量的文件进行重命名,以便更好地管理和查找文件。而且,有时候我们还需要将文件名称翻译成其他语言,以适应不同的工作需求。如何高效地完成这项任务呢?接下来,我将介绍一种方法,让你事半功倍。首先,你需要下载并安装一个名为“固乔文件管家”的软件。这是一款功能强大的文件管理工具,可以帮助你批量改名文件

山洪灾害预警方案(山洪预警解决方案的组成)

​随着气候变化的不断加剧,山洪灾害在许多地区成为了极具威胁性的自然灾害之一。为了帮助地方政府和居民更好地预防和应对山洪灾害,我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案,并成功在某地区进行了部署。案例背景:我们选择了某山区作为实际部署的案例。这个地区常年受山洪的威胁,由于地处偏远,传

使用 Verilator 进行 Verilog Lint

FPGA设计是无情的,所以我们需要利用能获得的任何软件进行检查。Verilator是一个Verilog仿真器,还支持linting:静态分析设计中的问题。Verilator不仅可以发现综合工具可能忽略的问题,而且运行速度也很快。Verilator也非常适合使用SDL进行图形仿真。安装VerilatorLinuxVeri

C++ Primer Plus 第七章笔记

目录函数基本知识没有返回值的函数:void函数有返回值的函数:函数原型1.为什么需要函数原型?2.函数原型的语法3.函数原型的功能按值传递函数参数形参和实参局部变量参数问题使用const指针参数调用自身的函数(递归)指向函数的指针1.获取函数的地址2.声明函数指针3.使用函数指针来调用函数函数基本知识要使用C++函数必

分布式协议与算法——Raft算法

目录Raft算法领导者选举有哪些成员身份?领导者选举流程选举细节节点之间如何通信什么是任期选举有哪写规则随机超时时间是什么小结日志复制如何理解日志如何复制日志如何实现日志的一致小结节点成员变更成员变更的问题如何通过单节点变更解决成员变更的问题小结Raft小结Raft算法Raft算法属于Multi-Paxos算法,它是在

2023年贵州省职业院校技能大赛高职组信息安全管理与评估竞赛试题

2023年贵州省职业院校技能大赛高职组信息安全管理与评估竞赛试题第一阶段竞赛项目试题根据信息安全管理与评估技术文件要求,第一阶段为网络平台搭建与网络安全设备配置与防护。本文件为信息安全管理与评估项目竞赛-第一阶段试题。介绍竞赛阶段任务阶段竞赛任务第一阶段平台搭建与安全设备配置防护任务1网络平台搭建任务2网络安全设备配置

【SQL】MySQL中的窗口函数(开窗函数)

窗口函数是MYSQL8.0新增的聚合函数:多行变一行,常见的sum,count,max,min窗口函数:行数不变,常见的row_number,rank语法格式:窗口函数(表达式)over(partitionby…orderby…frame_clause)partitionby是分区,类似于groupby,如去掉相当于对

MySQL数据库入门到精通1--基础篇(MySQL概述,SQL)

1.MySQL概述1.1数据库相关概念目前主流的关系型数据库管理系统:Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle又收购了Sun公司。目前Oracle推出了收费版本的MySQL,也提供了免费的社区版本。SQLServe

docker基础命令快速入门

docker快速入门Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。Docker的三个概念镜像Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数。镜像不包含任何动态数据,其内容

4k、VR与万兆光网

“全光万兆”对VR意义重大。pico4的分辨率PICO4的单眼分辨率是2160×2160,整体分辨率高达4320×2160。这是一款高性能的VR一体机,采用了2.56英寸的Fast-LCD屏幕,最高可实现90Hz刷新率,还有1200PPI和20.6PPD的超清晰画面表现。PICO4的视场角为105°,比上一代PICON

使用HTTP爬虫ip中的常见误区与解决方法

在使用HTTP爬虫进行网页抓取时,涉及到IP地址的处理,可能会存在一些常见的误区。以下是一些常见误区及解决方法:1.使用个人IP进行大规模爬取:如果你使用个人住宅IP进行大规模爬取,可能会被目标网站视为恶意攻击,从而导致被封禁。解决方法:使用代理IP,或者租用专门的爬虫服务器。2.忽略IP封禁:一些网站可能会封禁特定的

热文推荐