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
相关产品推荐
相关产品推荐

