《面试官冷笑:箭头函数能当构造函数吗?答错直接挂!》

前言:在上一篇文章我们了解到了一些面试中经常被问到的ES6+的新特性,面试官问完ES6+的新特性后,经常会接着追问你让你讲一下箭头函数与普通函数的区别。许多人都不能答全,接下来让我们来深入了解下箭头函数究竟是何方神圣?

当面试官问箭头函数与普通函数的区别时,我们可以从以下几个方面来回答

1. 语法层面

  • 简洁性 :箭头函数语法更加简洁。对于单个参数,可省略括号;若函数体只有一条语句,还能省略花括号和return关键字。比如:
js 复制代码
// 箭头函数 
const square = num => num * num;
// 普通函数 
function squareFunction(num) { 
    return num * num; 
}
  • 参数定义 :普通函数使用function关键字定义,参数在括号内。而箭头函数使用=>来分隔函数和函数体。

2. this指向

  • 普通函数this的指向取决于函数的调用方式。它可以指向全局对象(在浏览器中是window)、函数本身、对象实例、或者构造函数等。例如:
js 复制代码
const obj = {
    name: 'Alice',
    sayName: function () {
        console.log(this.name);
    }
};
obj.sayName(); // 输出 'Alice',this 指向 obj

function test() {
    console.log(this);
}
test(); // 在浏览器中输出 window 对象, 在 Node.js 中输出 global 对象
  • 箭头函数 :没有自己的this,它的this继承自外层函数。这能避免在嵌套函数中this指向改变的问题。例如:
js 复制代码
const obj = {
    name: 'Bob',
    sayName: function () {
        const arrow = () => {
            console.log(this.name);
        };
        arrow();
    }
};
obj.sayName(); // 输出 'Bob',this 继承自外层的 sayName 函数

3. arguments对象

  • 普通函数 :有自己的arguments对象,它是一个类数组对象,包含了函数调用时传递的所有参数。例如:
js 复制代码
function showArgs() {
    console.log(arguments);
}
showArgs(1, 2, 3); // 输出 Arguments(3) [1, 2, 3]
  • 箭头函数 :没有自己的arguments对象。若要获取参数,可以使用剩余参数语法。例如:
js 复制代码
const showArgsArrow = (...args) => {
    console.log(args);
};
showArgsArrow(4, 5, 6); // 输出 [4, 5, 6]

4. 构造函数使用

  • 普通函数 :可以作为构造函数,使用new关键字创建对象实例。例如:
js 复制代码
function Person(name) {
    this.name = name;
}
const person = new Person('Charlie');
console.log(person.name); // 输出 'Charlie'
  • 箭头函数 :不能用作构造函数,使用new关键字调用箭头函数会报错。因为箭头函数没有自己的thisprototype,无法创建对象实例。例如:
js 复制代码
const ArrowPerson = (name) => {
    this.name = name;
};
try {
    const arrowPerson = new ArrowPerson('David'); // 会抛出错误
} catch (error) {
    console.error(error);
}

5. yield关键字使用

  • 普通函数 :在生成器函数中可以使用yield关键字,用于暂停和恢复函数的执行。例如:
js 复制代码
function* generator() {
    yield 1;
    yield 2;
    yield 3;
}
const gen = generator();
console.log(gen.next().value); // 输出 1
  • 箭头函数 :不能使用yield关键字,所以不能用作生成器函数。
相关推荐
阿蒙Amon2 分钟前
JavaScript学习笔记:17.闭包
javascript·笔记·学习
elangyipi1232 分钟前
深入理解前端项目中的 package.json 和 package-lock.json
前端·json
Wpa.wk4 分钟前
自动化测试 - 文件上传 和 弹窗处理
开发语言·javascript·自动化测试·经验分享·爬虫·python·selenium
l1t7 分钟前
利用小米mimo为精确覆盖矩形问题C程序添加打乱函数求出更大的解
c语言·开发语言·javascript·人工智能·算法
LYFlied15 分钟前
【算法解题模板】-【回溯】----“试错式”问题解决利器
前端·数据结构·算法·leetcode·面试·职场和发展
composurext15 分钟前
录音切片上传
前端·javascript·css
程序员小寒15 分钟前
前端高频面试题:深拷贝和浅拷贝的区别?
前端·javascript·面试
狮子座的男孩20 分钟前
html+css基础:07、css2的复合选择器_伪类选择器(概念、动态伪类、结构伪类(核心)、否定伪类、UI伪类、目标伪类、语言伪类)及伪元素选择器
前端·css·经验分享·html·伪类选择器·伪元素选择器·结构伪类
zhougl99621 分钟前
Vue 中的 `render` 函数
前端·javascript·vue.js
听风吟丶23 分钟前
Spring Boot 自动配置深度解析:原理、实战与源码追踪
前端·bootstrap·html