为什么bind可以解决「在Window上执行fetch失败:非法调用」报错?
原理说明
核心是JavaScript函数的this是运行时动态绑定的,而浏览器原生的fetch方法依赖this必须指向Window实例才能正常运行。
- 第一段代码报错的原因:
你把window.fetch赋值给s.f后,调用s.f("https://www.google.com")时,按照JS的隐式绑定规则,此时fetch内部的this指向的是s对象,而不是window,不符合fetch的内部实现要求,因此抛出Illegal invocation非法调用错误。 bind解决问题的逻辑:Function.prototype.bind()是JS函数原型上的原生方法,调用后会返回一个新的绑定函数,这个新函数的this会被永久固定为bind接收的第一个参数,后续无论用什么方式调用这个绑定函数,this都不会再发生变化。
第二段代码里通过window.fetch.bind(window)提前把fetch的this永久绑定到了window上,之后哪怕把它赋值给s的属性调用,this依然是符合要求的window对象,所以可以正常运行。
同类常见场景:把
console.log赋值给普通变量后直接调用也会报非法调用,本质都是原生方法依赖固定的宿主对象作为this,赋值后隐式绑定改变了this指向导致的。
内容的提问来源于stack exchange,提问作者jeffbRTC
相关产品推荐
相关产品推荐

