未捕获的TypeError:this._isDateType不是Arrow函数内的函数&Quot;(&Q;)
我每次都会收到找不到函数定义的类型错误。代码如下所示:
return BaseController.extend("ch.micarna.weightprotocol.controller.Calendar", {
onInit: function () {
console.log(this._isDateType(new Date()));
let oHbox = this.byId("calendar-container");
let oTodayDate = new Date();
let oEndDate = this._getLastDayOfMonth(oTodayDate);
},
_getLastDayOfMonth: (oBegin) => {
if (this._isDateType(oBegin)) {
throw new TypeError("The given parameter is not type of date.");
}
return new Date(oBegin.getFullYear(), oBegin.getMonth() + 1, 0);
},
_isDateType: (oDate) => {
return Object.prototype.toString.call(oDate) === "[object Date]";
},
});
问题在于_isDateType
函数在_getLastDayOfMonth
函数内调用时找不到它。
我设置了断点:
如您所见,该函数未定义,我不知道原因。
在onInit
函数的开头,我调用了_isDateType
函数:
console.log(this._isDateType(new Date()));
,并提供了预期的结果。
我做错了什么?
解决方案
替换箭头函数
_getLastDayOfMonth: (oBegin) => {
// this....
},
正常function expression:
_getLastDayOfMonth: function(oBegin) {
// this...
},
这样_getLastDayOfMonth
可以自由访问Controller实例内的其他方法。
为什么它不能与箭头函数配合使用
首先,重要的是要知道箭头函数在词法上绑定它们的上下文。
箭头函数表达式的语法比函数表达式短,没有自己的
this
。[source].bind
。它们在评估时从闭包中获取this
。- 由于
this
不是控制器的实例,而是调用BaseController.extend
时的window
对象,因此在箭头函数内部调用this._isDateType
等同于window._isDateType
。
相关文章