2016-01-18 2 views
1

Итак, я начал работать с TypeScript недавно, и мне это до сих пор нравится, но есть проблема, которую я просто не понимаю, почему она не работает должным образом.TypeScript var scoping

ключевое слово "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 (плагин-машинопись).

Заранее благодарен!

ответ

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 VS. this.month И/ИЛИ addEventListener VS. фактически вызывающей функции.

Больше

На основании пользовательского комментария:

Я понимаю, что 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); 
+0

Я понимаю, что 'this.month' является 0, так как хорошо' date.getMonth() 'на самом деле 0. Моя проблема в том, что это не хочет, чтобы увеличить, вероятно, Я не получаю 'addEventListener' часть функции или, может быть, вы сказали, что я смущен, потому что, предположим, нужно увеличивать клик по правилу? Он должен возвращать новое значение каждый раз, когда пользователь щелкает правой кнопкой? Или ... Не уверен, хотя – Mark

+0

О, ладно, я понимаю сейчас. Спасибо, басарат! :) – Mark