所以我最近开始使用TypeScript,到目前为止我很享受它,但有一个问题,我根本无法理解为什么它不能正常工作。
仍然可以在TypeScript中访问“var”关键字,我知道它是一个函数范围,而不是“let”关键字的块范围。我有以下代码,我无法弄清楚它为什么不起作用:
class Calendar {
month: number;
months: string[];
weekday: number;
day: number;
constructor() {
this.month = date.getMonth();
this.months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'November', 'December'];
this.weekday = date.getDay();
this.day = date.getDate();
}
nextMonth() {
var months = this.months;
var currentmonth: number = this.month;
el('.icono-caretRight').addEventListener('click', () => {
currentmonth = (currentmonth + 1) % months.length;
}, false);
month = currentmonth;
return month;
}
previousMonth() {
el('.icono-caretLeft').addEventListener('click', () => {
month--;
}, false);
}
}
let calendar = new Calendar();
let month = calendar.month;
let nextmonth = calendar.nextMonth();
console.log(nextmonth);
查看nextMonth()函数。我不知道为什么“月”变量没有增加。我到底错在了什么?
注意:我正在使用JSPM + TypeScript(plugin-typescript)。
提前致谢!
答案 0 :(得分:2)
" var"关键字仍然可以在TypeScript中自然访问,我知道它是一个函数范围,而不是" let"关键词。我有以下代码,但我无法弄清楚它为什么不起作用:
您对scoping
的理解是正确的。
以下代码可以正常运行:
class Calendar {
month: number = 0;
months: string[];
constructor() {
this.months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'November', 'December'];
}
nextMonth() {
var months = this.months;
var currentmonth: number = this.month;
currentmonth = (currentmonth + 1) % months.length;
month = currentmonth;
return month;
}
}
let calendar = new Calendar();
let month = calendar.month; // 0
let nextmonth = calendar.nextMonth();
console.log(nextmonth); // 1
我怀疑您对month
与this.month
和/或addEventListener
与实际调用函数感到困惑。
根据用户评论:
我知道this.month为0,因为date.getMonth()实际上是0.我的问题是不想增加,可能我没有得到addEventListener的一部分功能或者像你说的那样我很困惑,因为它假设在点击正确时增加?每次用户点击它时,它必须返回一个新值?或者......不再确定
代码
el('.icono-caretRight').addEventListener('click', () => {
currentmonth = (currentmonth + 1) % months.length;
}, false);
您可能希望在构造函数中执行某些操作。而且你很可能想要:
el('.icono-caretRight').addEventListener('click', () => {
this.nextMonth();
}, false);