JS函数的二义性

举例

// 情况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

总结

  1. 函数的二义性,就是函数作为普通函数调用时,返回的是函数的返回值,函数作为构造函数调用时,返回的是构造函数的实例对象。这样会造成使用方式不清晰
  2. 箭头函数,只有一种调用方式,即作为普通函数调用
  3. class的调用方式,只有一种,即new
  4. 其实ES6的箭头函数和class,都是为了解决函数的二义性而存在的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容