举例
// 情况1:作为普通函数调用 -> 返回字符串
Date(); // 'Tue Nov 18 2025 17:38:19 GMT+0800 (中国标准时间)'
// 情况2:作为构造函数调用 -> 返回Date对象
new Date(); // Date对象
// 情况3:没有new但用在需要对象的上下文中
typeof Date(); // 'string'
typeof new Date(); //'object'
函数的二义性,就是函数作为普通函数调用时,返回的是函数的返回值,函数作为构造函数调用时,返回的是构造函数的实例对象。
这样的情况下,虽然提供了灵活性,但也带来了混淆的风险
箭头函数
// 后续就在es6中更新了箭头函数
let fn = (str) => str
fn('张三')//'张三'
new fn('李四')//Uncaught TypeError: fn is not a constructor
在这里,箭头函数只有一种调用方式,即作为普通函数调用
class
class User{};
User()//Uncaught TypeError: Class constructor User cannot be invoked without 'new'
new User()//User {}
class的调用方式,只有一种,即new
总结
- 函数的二义性,就是函数作为普通函数调用时,返回的是函数的返回值,函数作为构造函数调用时,返回的是构造函数的实例对象。这样会造成使用方式不清晰
- 箭头函数,只有一种调用方式,即作为普通函数调用
- class的调用方式,只有一种,即new
- 其实ES6的箭头函数和class,都是为了解决函数的二义性而存在的