如果 new 一个箭头函数会怎么样

131 阅读5分钟

1.如果 new 一个箭头函数会怎么样?

回答重点

会报错,因为箭头函数设计上并不具备构造函数的特性,没有自己的this 对象,没有 prototype 属性,所以 new 一个箭头函数会报错。

扩展知识

  1. 报错:会抛出一个 TypeError

· let fun =()=>{console.1og("是一个箭头函数”)};

· new fun();

// TypeError: fun is not a constructor

  1. 当我们 new 一个构造函数后:

1.会创建一个新的对象

2.将函数的作用域赋给新对象,也就是将对象的_proto_属性指向 prototype 属性

3.将新建的对象设置给函数中 this

4.如果函数没有返回对象则返回 this

通过上述步骤可知:第 2,3步,头函数都无法执行。 总结: 因为箭头函数没有 prototype 属性,且箭头函数的 this 的指向在它被定义的时候就已经确定了且不会改变,所以无法 new 一个箭头函数。

2 .ES6 箭头函数的 this 指向哪里?

ES6 箭头函数的 this 指向定义它时所处上下文的对象的 this。 箭头函数的 this 指向是固定的,在函数定义时就确定了,之后不会再改变。

扩展知识

箭头函数和普通函数不同,普通函数的 this 是在调用时决定的,。

1)箭头函数的 this 绑定:

箭头函数没有自己的 this 值,它会捕获上下文中的 this 作为自己的 this。无论箭头函数是如何调用的,它的 this 始终保持不变。

2)普通函数的 this 绑定:

普通函数的 this 是动态的,取决于函数的调用方式。它可能指向全局对象、调用它的对象或显式绑定的对象(通过 call、apply、bind)。

function Outer(){
this.name = 'outer';

//普通函数
function InnerFunc()fconsole.log(this.name);//这里的this、取决于InnerFunc 的调用方式
J
// 箭头函数
const InnerArrow=()=>{console.log(this.name);//这里的this、始终指向 0uter的实例
J;
this.innerFunc = InnerFunc;
this.innerArrow = InnerArrow;
const obj= new Outer();
obj.innerFunc();//“0uter”:指向全局对象的`name`(在非严格模式下);undefined:(在严格模式下)
obj.innerArrow();//“Outer"

3)箭头函数在处理回调函数时特别有用,因为它避免了常见的 this 绑定问题。

function Timer(){
this.seconds =0;
setInterval(()=>{this.seconds++;console.log(this.seconds);//这里的this、始终指向 Timer 的实例},1000);
const timer =new Timer();

总结: 箭头函数的 this 在定义时就被绑定到它所在的上下文,而不是在调用时决定。这使得節头函数在处理嵌套回调函数时特别有用,避免了复杂的 this 绑定问题

3. 什么是 ES6 的数组解构和对象解构?

ES6引入了数组解构和对象解构语法,这些功能让我们能够直接从数组或对象中提取值并赋予变量,从而减少代码冗长度和提升可读性。数组解构允许你技顺序获取数组中的元素,而对象解构让你可以直接获取对象中的属性值。

1.数组解构:通过类似数组的语法来分配数组中的元素到变量中。

const[a,b,c]=[1,2,3];
console.log(a);// 输出1
console.log(b);//翰出 2
console.log(c);//输出 3

2.对象解构:通过类似对象的语法来分配对象中的属性值到变量中。

const user ={name:'Alice', age: 25 };
const {name, age }=user;
console.log(name);//输出'Alice
console.log(age);// 输出 25

更复杂的解构 解构不仅限于简单的一层,还可以处理更复杂的场景,譬如嵌套解构和默认值:

        const person =
            name:'Bob'
            address:{
                city:'New York'
                zip:'10001'
            }
        const{name,address:{city,zip}}=person;
        console.log(city);
         //输出'New Yorkconsole.log(zip);
         //输出'10001'

2.默认值:

    const[x=10,y=5]=[undefined];console.log(x);//输出 10console.log(y);//输出5
    const{a=3,b=4}={a: undefined};
    console.log(a);//输出 3
    console.log(b);//输出 4

Promise是高阶函数

const myPromise = new Promise((resolve, reject) => {}

在前端开发中,Promise是一种用于处理异步操作的对象,它代表了一个异步操作的最终完成(或失败)及其结果值。以下是对Promise的详细介绍:

基本概念

  • Promise有三种状态:

    • Pending(进行中) :初始状态,既不是成功,也不是失败状态。表示异步操作正在进行中,还没有得出结果。
    • Fulfilled(已成功) :意味着异步操作成功完成,并且可以通过Promise对象获取到操作的结果值。
    • Rejected(已失败) :表示异步操作失败了,通常会携带一个原因,用于说明失败的原因。
  • 一旦PromisePending状态转变为FulfilledRejected状态,就称为 “已解决(settled)”,状态就不会再发生变化。

主要作用

  • 解决回调地狱:在传统的异步编程中,多个异步操作嵌套时会出现回调函数层层嵌套的情况,这被称为 “回调地狱”,会导致代码难以阅读和维护。Promise通过链式调用的方式来处理异步操作,使代码更加清晰和易于理解。
  • 异步操作的管理和组合:可以方便地对多个异步操作进行管理和组合,比如并行执行多个异步操作,然后在所有操作都完成后执行一些逻辑,或者按照顺序依次执行多个异步操作等。

基本用法

  • 创建一个Promise实例,需要传入一个执行器函数,该函数接受两个参数,分别是resolvereject函数。resolve函数用于将Promise状态从Pending变为Fulfilled,并传递成功的值;reject函数用于将状态变为Rejected,并传递失败的原因。示例如下:

const myPromise = new Promise((resolve, reject) => {
  // 模拟一个异步操作,比如延迟1秒后返回结果
  setTimeout(() => {
    const randomNumber = Math.random();
    if (randomNumber > 0.5) {
      resolve('操作成功,随机数大于0.5');
    } else {
      reject('操作失败,随机数小于等于0.5');
    }
  }, 1000);
});
  • 可以使用then方法来处理Promise成功和失败的情况,then方法接受两个回调函数,第一个回调函数在Promise成功时调用,第二个回调函数在Promise失败时调用。示例如下:

4. JS 常见的报错

  1. JS 的 error 处理

1.3.1. 错误的类型

  1. Error: 所有错误的父类型

  2. ReferenceError: 引用的变量不存在

  3. TypeError: 数据类型不正确的错误

  4. RangeError: 数据值不在其所允许的范围内

  5. SyntaxError: 语法错误

1.3.2. 错误处理

  1. 捕获错误: try ... catch

  2. 抛出错误: throw error