【问题标题】:TypeScript var scopingTypeScript var 作用域
【发布时间】:2016-01-18 04:17:23
【问题描述】:

所以我最近开始使用 TypeScript,到目前为止我很喜欢它,但是有一个问题我根本无法理解为什么它不能正常工作。

“var”关键字在 TypeScript 中仍然可以自然访问,我知道它是一个函数作用域,而不是“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(插件类型脚本)。

提前致谢!

【问题讨论】:

    标签: javascript typescript var


    【解决方案1】:

    “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 AND / OR 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);
    

    【讨论】:

    • 我知道this.month 是0,因为date.getMonth() 实际上是0。我的问题是不想增加,可能我没有得到addEventListener 部分的功能,或者可能像你说的我很困惑,因为它假设点击正确?每次用户点击时它都必须返回一个新值,对吗?或者……虽然不确定了
    • 哦,好的,我现在明白了。谢谢巴萨拉特! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2018-12-22
    • 2020-07-01
    • 2015-07-03
    • 2012-01-18
    • 2013-03-27
    相关资源
    最近更新 更多