TypeScript var范围

时间:2016-01-18 04:17:24

标签: javascript typescript var

所以我最近开始使用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)。

提前致谢!

1 个答案:

答案 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

我怀疑您对monththis.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);