JavaScript中使用call方法调用函数未得到正确返回值的问题
问题产生原因
你对call方法的参数传参规则理解有误,核心逻辑如下:
- 当你把对象方法
flightName.book赋值给变量book1时,book1成为了独立的普通函数,和原flightName对象解绑,直接调用时this不会再指向flightName。 call是Function原型上的方法,第一个参数永远是函数执行时要绑定的this指向,从第二个参数开始,才是按顺序传入原函数的业务参数。- 你写的
book1.call('Johnny', 'King')实际执行逻辑是:- 将
book1运行时的this绑定为字符串值'Johnny' - 仅向
book函数传入了1个业务参数'King',对应形参列表里的第一个参数flightname - 第二个形参
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
相关产品推荐
相关产品推荐

