函数调用带()与不带()的疑问:为何出现非函数报错及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
相关产品推荐
相关产品推荐

