2017-01-20 2 views
3

Попытка создать цикл таймера в машинописном:машинопись SetTimeout цикл прохождения этой ошибки

timeout() { 
    setTimeout(function() { 
     console.log('Test'); 
     this.timeout(); 
    }, 1000/60); 
} 

Но после того, как первый цикл работает правильно, я получаю эту ошибку: «Uncaught TypeError: this.timeout не является функцией ». Кажется, что эта переменная не существует после начального цикла. Есть идеи?

+2

При использовании функции со стрелками ('=>') вместо 'function' то' this' контекст будет захвачен внутри вложенной функции автоматически. Полезные документы: https://basarat.gitbooks.io/typescript/content/docs/arrow-functions.html и https://www.typescriptlang.org/docs/handbook/functions.html – JBC

ответ

4

Из-за этого контекст потерян. Используйте функцию стрелки, это лучше.

timeout() { 
    setTimeout(() => { 
     console.log('Test'); 
     this.timeout(); 
    }, 1000/60); 
} 
10

Потому что ваш this не относится к объекту. У каждой функции есть это. Таким образом, ваш this является тем, который определен анонимной функцией внутри setTimeout().

Чтобы сделать вашу программу работы, вам необходимо провести this перед таймаутом и использовать эту переменную.

class Test { 
 
    
 
    timeout() { 
 
     var that = this; 
 
     setTimeout(function() { 
 
      console.log('Test'); 
 
      that.timeout(); 
 
     }, 1000/60); 
 
    } 
 
    
 
} 
 

 

 
let t = new Test(); 
 
t.timeout();

Или вы можете работать с lambda functions, который будет держать this к объекту. Lamda's this будет ссылаться на внешний this, который вызывает функцию лямбда`.

class Test { 
 
     
 
    timeout() { 
 
     setTimeout(() => { 
 
      console.log('Test'); 
 
      this.timeout(); 
 
     }, 1000/60); 
 
    } 
 
     
 
} 
 

 

 
let t = new Test(); 
 
t.timeout();

 Смежные вопросы

  • Нет связанных вопросов^_^