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

JavaScript函数调用疑问:为何this.func报错而func.call(this,x)正常?

原代码报错原因与call写法的差异解析

咱们一步步拆解来看:

先看原代码报错的核心问题

当你把worker.slow替换成wrapper(worker.slow)返回的匿名函数后,调用worker.slow(2)时:

  • 匿名函数里的this会指向worker对象(因为是通过worker.前缀调用的方法)。
  • 原代码里的this.func(x)是在尝试访问worker.func,但worker对象根本没有func这个属性!func是wrapper函数的参数,是咱们传进去的原worker.slow函数,它和worker对象没有任何关联,所以this.func会是undefined,调用它自然就抛出TypeError: this.func is not a function了。

再看func.call(this, x)为什么能正常运行

  • func本身就是原有的worker.slow函数,这个函数内部依赖this.someMethod(),所以它必须拿到正确的this指向才能正常工作。
  • call方法的核心作用就是显式指定函数执行时的this上下文,这里把匿名函数里的this(也就是worker对象)传给func,相当于让原worker.slow函数在worker的上下文里执行,这样内部的this.someMethod()就能正确调用得到4,再乘以传入的x=2,结果自然就是预期的8了。

两者的核心差异总结

  • this.func(x):错误地将func当成了this(即worker)的属性,而func实际是外部变量,和this无关联。
  • func.call(this, x):正确利用call绑定了func执行时的this上下文,同时传入参数,让原函数能在正确的环境中执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:46:08