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

JavaScript中使用call方法调用函数未得到正确返回值的问题

问题产生原因

你对call方法的参数传参规则理解有误,核心逻辑如下:

  • 当你把对象方法flightName.book赋值给变量book1时,book1成为了独立的普通函数,和原flightName对象解绑,直接调用时this不会再指向flightName。
  • call是Function原型上的方法,第一个参数永远是函数执行时要绑定的this指向,从第二个参数开始,才是按顺序传入原函数的业务参数。
  • 你写的book1.call('Johnny', 'King')实际执行逻辑是:
    1. 将book1运行时的this绑定为字符串值'Johnny'
    2. 仅向book函数传入了1个业务参数'King',对应形参列表里的第一个参数flightname
    3. 第二个形参text没有接到任何传值,因此输出undefined
      这和你拿到的运行结果完全匹配。
call方法的正确使用方式

基础语法

targetFunction.call(thisArg, arg1, arg2, /* ...后续实参按顺序传入 */)

参数说明:

  • thisArg:函数运行时绑定的this值,非严格模式下如果传null/undefined,this会自动指向全局对象(浏览器环境为window,Node环境为global)
  • 从第二个参数开始,按顺序对应目标函数定义时的形参

你的代码的修正方案

因为你定义的book函数里没有用到内部this,你只需要把第一个参数传null占位,后面跟上两个业务参数即可:

// 修正后的调用
book1.call(null, 'Johnny', 'King');
// 运行输出:This is Johnny,King

如果你后续修改book函数需要用到原对象flightName里的属性(比如airline、itaCode),就把第一个参数传为原对象,保证函数内部this指向正确:

book1.call(flightName, 'Johnny', 'King');
// 此时函数内部可以正常通过this.airline拿到'luftansa'的值

补充:和call用法相似的apply方法,唯一区别是业务参数需要以数组形式整体传入,例如book1.apply(flightName, ['Johnny', 'King'])的执行效果和上述call写法完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:24:31