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

前言:在上一篇文章我们了解到了一些面试中经常被问到的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关键字,所以不能用作生成器函数。
相关推荐
Jonathan Star3 分钟前
跨域处理的核心是解决浏览器的“同源策略”限制,主流方案
javascript·chrome·爬虫
洛小豆6 分钟前
她问我::is-logged 是啥?我说:前面加冒号,就是 Vue 在发暗号
前端·vue.js·面试
我有一棵树12 分钟前
前端开发中 SCSS 变量与 CSS 变量的区别与实践选择,—— 两种变量别混为一谈
前端·css·scss
white-persist27 分钟前
JWT 漏洞全解析:从原理到实战
前端·网络·python·安全·web安全·网络安全·系统安全
果粒chenl1 小时前
React学习(四) --- Redux
javascript·学习·react.js
IT_陈寒1 小时前
React 性能优化:5个实战技巧让首屏加载提升50%,开发者亲测有效!
前端·人工智能·后端
rising start1 小时前
前端基础一、HTML5
前端·html·html5
Never_Satisfied1 小时前
在JavaScript / HTML中,div容器在内容过多时不显示超出的部分
开发语言·javascript·html
鬼谷中妖1 小时前
JavaScript 循环与对象:深入理解 for、for...in、for...of、不可枚举属性与可迭代对象
前端