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

前言:在上一篇文章我们了解到了一些面试中经常被问到的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关键字,所以不能用作生成器函数。
相关推荐
22:30Plane-Moon18 分钟前
跨域解决方案
javascript
上单带刀不带妹1 小时前
Node.js 中的 fs 模块详解:文件系统操作全掌握
开发语言·javascript·node.js·fs模块
运维帮手大橙子2 小时前
完整的登陆学生管理系统(配置数据库)
java·前端·数据库·eclipse·intellij-idea
_Kayo_3 小时前
CSS BFC
前端·css
二哈喇子!4 小时前
Vue3 组合式API
前端·javascript·vue.js
二哈喇子!5 小时前
Vue 组件化开发
前端·javascript·vue.js
C4程序员6 小时前
北京JAVA基础面试30天打卡03
java·开发语言·面试
chxii6 小时前
2.9 插槽
前端·javascript·vue.js
姑苏洛言6 小时前
扫码点餐小程序产品需求分析与功能梳理
前端·javascript·后端
Freedom风间7 小时前
前端必学-完美组件封装原则
前端·javascript·设计模式