JS调用同文件textSize方法报is not a function错误
错误根因
这个报错是典型的this指向错误:
你在Array.map()中传入了普通function形式的回调函数,这类函数运行时会绑定自己的this上下文,不会继承外层getYTickNumberWidth方法的this,所以回调里的this根本不是你挂载textSize方法的对象,自然找不到textSize函数。
至于直接写textSize调用报未定义,是因为textSize不是全局作用域下的独立函数,是和getYTickNumberWidth一起挂载在同一个外层对象(类实例/配置对象)上的方法,脱离对象直接调用当然找不到定义。
修复方法
任选一种即可解决:
- 方法1:利用
map方法的第二个参数指定回调的this指向,数组原生map和d3的map实现都支持这个参数:
return d3.max(dataValues.map( function(d) { let size = this.textSize(tickLabelFormat(d)); return size.width; }, this // 新增该行,把外层的this传入回调作为执行上下文 ));
- 方法2:把回调改成箭头函数,箭头函数不会生成独立的执行上下文,会直接继承外层作用域的
this指向:
return d3.max(dataValues.map( (d) => { // 替换原有的function(d)为箭头函数 let size = this.textSize(tickLabelFormat(d)); return size.width; } ));
- 方法3:在外层方法中提前缓存
this引用,回调内使用缓存的引用调用方法:
getYTickNumberWidth(dataValues, tickLabelFormat) { const _this = this; // 提前缓存外层this return d3.max(dataValues.map( function(d) { let size = _this.textSize(tickLabelFormat(d)); // 用缓存的_this调用方法 return size.width; } )); },
注意:你代码里的console.log(this.textSize())没有传入必填的text参数,等this指向修复后这行也会因为缺参报错,调试完建议删除或者补全入参。
内容的提问来源于stack exchange,提问作者CedricCT
相关产品推荐
相关产品推荐

