类中调用作为参数的方法时无法访问类字段,原因是什么?
问题原因分析
这个报错的核心是类方法的this绑定丢失,具体细节如下:
- 类内部默认运行在严格模式下,类的方法本身并不会自动绑定当前实例的
this。当你在constructor里把this.func1、this.func2作为参数传给compose2时,传递的仅仅是函数本身,原有的与Test实例的绑定关系被切断了。 - 在
compose2的reduce回调里直接调用nextFunc()属于普通函数调用,严格模式下这种调用的this会是undefined,自然无法读取this.field1这类实例属性,触发报错。 - 非类写法能正常运行的原因:如果是用对象字面量创建的非类结构,若处于非严格模式,普通函数调用的
this会指向全局对象(浏览器环境为window);或者调用时直接通过对象引用调用(比如obj.func1()),this会绑定到对象。但类强制启用严格模式,不存在这个“兜底”的全局this。
常见修复方式
- 在传递方法时手动绑定
this:this.compose2(this.func1.bind(this), this.func2.bind(this), this.func3.bind(this)) - 把方法定义为箭头函数,箭头函数会继承外层作用域的
this:func1 = () => { console.log("init func1"); console.log(this.field1.data); } - 在调用时用
call/apply绑定this:nextFunc.call(this)
内容的提问来源于stack exchange,提问作者김찬기
相关产品推荐
相关产品推荐

