You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数调用带()与不带()的疑问:为何出现非函数报错及undefined?

问题解析

第一种情况:let fn = user.showName(); 报错“不是函数”

当你给showName加括号()时,你不是在赋值函数本身,而是直接执行了这个函数。
你的showName函数里只有console.log语句,没有写return,所以函数执行完的返回值是undefined。这时候fn就被赋值成了undefined,再调用fn(),相当于让undefined去执行函数,自然会报错“不是函数”。

第二种情况:let fn = user.showName; 输出“I'm undefined”

这里你没加括号,是把showName这个函数本身赋值给了fn,所以fn是一个可调用的函数。
问题出在this的指向:原本user.showName()调用时,this指向user对象,能拿到user.name的值。但把函数赋值给fn后,直接调用fn(),在非严格模式下this会指向全局对象(浏览器里是window,Node.js里是global),这个全局对象里没有name属性,所以this.name就是undefined,最终输出“I'm undefined”。

如果想让fn调用时仍能拿到user的name,可以用bind绑定this:

let fn = user.showName.bind(user);
fn(); // 输出"I'm Mike"

内容的提问来源于stack exchange,提问作者Samuel Yoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:40:28