Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.11.2017, 11:13
Интересующийся
Отправить личное сообщение для victornalchik Посмотреть профиль Найти все сообщения от victornalchik
 
Регистрация: 18.11.2017
Сообщений: 21

теряется this
Здравствуйте! Возникла проблема с потерей this.
Имеется у класса контроллер метод startGame (общается к классу модели), который вызывается при нажатии кнопки.

первый вариант все отрабатывает и показывает(разовый вызов при нажатии 1- вариант), как только заношу в setInterval(для переодического вызова 2-ой), this теряется. Не знаю как решить проблему(


startGame(){

//1-ый вариант

this.matrix = this.model.createChangeMatrix(this.matrix, this.row, this.column, null, null);
return this.matrix;



//2-ой вариант

this.flagGame = setInterval(function() {
this.matrix = this.model.createChangeMatrix(this.matrix, this.row, this.column, null, null);
return this.matrix;
},1000);


}
Ответить с цитированием
  #2 (permalink)  
Старый 18.11.2017, 11:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

victornalchik,
сохраните this в переменную, классика var that = this; ...that.matrix =

Последний раз редактировалось рони, 18.11.2017 в 15:24.
Ответить с цитированием
  #3 (permalink)  
Старый 18.11.2017, 12:22
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

Сообщение от рони
сохраните this в переменную, классика var self = this; ...self.matrix =
Я как-то читал, что в self не рекомендуется сохранять. Правильнее использовать ключевое слово that
Ответить с цитированием
  #4 (permalink)  
Старый 18.11.2017, 15:16
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

self - ключевое слово js, ссылка на текущее окно, поэтому лучше использовать that или что угодно другое
Ответить с цитированием
  #5 (permalink)  
Старый 18.11.2017, 15:24
Интересующийся
Отправить личное сообщение для victornalchik Посмотреть профиль Найти все сообщения от victornalchik
 
Регистрация: 18.11.2017
Сообщений: 21

Большое спасибо! Помогло!
Ответить с цитированием
  #6 (permalink)  
Старый 18.11.2017, 15:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

Rasy,
Dilettante_Pro,
ок!
Ответить с цитированием
  #7 (permalink)  
Старый 18.11.2017, 18:18
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

рони,
Бдим!
Ответить с цитированием
  #8 (permalink)  
Старый 19.11.2017, 11:00
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

перечислю все известные мне способы решения "детских" проблем с this. Почему детских? Потому, что разработчики со стажем знают, что this в JS -- динамический.


1) используя замыкание (об этом писали здесь выше)
function foo() {
  const that = this
  setTimeout(function () {
    console.log(that)
  })
}

2) используя привязку контекста и каррирование -- .bind()
function foo() {
  setTimeout(function () {
    console.log(this)
  }.bind(this))
}

3) явное указание контекста -- .apply() .call()
function foo() {
  console.log(this)
}

foo.call(/*ctx*/)
foo.apply(/*ctx*/)

4) используя arrow function
function foo() {
  setTimeout(_ => {
    console.log(this)
  })
}

5) используя классы TypeScript (если я правильно помню, могу ошибаться)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #9 (permalink)  
Старый 20.11.2017, 03:21
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

А можно и по-извращаться.)
Например мне нравится такой милый ленивый геттер, который заодно ещё и биндит this к функции, 2 в 1 :
var obj = {
  bar: false,
  get foo(){
    this.bar = 2;
    delete this.foo;
    return this.foo = () => {
      this.bar *= 2;
    }
  }
}

setTimeout(obj.foo, 100);
setTimeout(()=>console.log(obj.bar), 200);
оно конечно надо не всегда, но когда совпадает - приятно.)
__________________
29375, 35
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В callback функции теряется контекст. Как это обойти? xintrea AJAX и COMET 4 02.06.2013 11:40
Теряется фокус Valdemor jQuery 3 28.08.2012 15:46
Клонирую input через JQ и теряется его value Sergey999 Javascript под браузер 9 02.04.2012 00:02
Теряется selection при потере фокуса danik.js Internet Explorer 1 15.10.2010 08:33
Теряется event при перемещении объекта (Drag&Drop) seagor Events/DOM/Window 16 25.07.2007 01:28