Не инкрементируется значение i

180
08 октября 2018, 22:00

Возник вопрос в коде, а именно не инкрементируется значение this._i.

function Ticker() { 
  this._i = 0; 
}; 
 
Ticker.prototype = { 
  tick: function() { 
    console.log(this._i, this._i++); 
  } 
}; 
 
var ticker = new Ticker(); 
 
setInterval(ticker.tick, 1000);

Прошу помощи, заранее спасибо!

Answer 1

Дело вот в чем. Когда Вы передаете ссылку на функцию ticker.tick первым параметром в setInterval, контекст (объект ticker) туда не попадает. Эта функция вызывается в контексте window, у которого свойства _i нет. Обратите внимание, я добавил this._i в console.log, и самое первое обращение к этому свойству, до каких-либо арифметических действий с ним, выводит undefined. Надо передавать в setInterval обертку функции с контекстом:

function Ticker() { 
  this._i = 0; 
}; 
 
Ticker.prototype = { 
  tick: function() { 
    console.log(this._i, this._i++); 
  } 
}; 
 
var ticker = new Ticker(); 
 
setInterval(ticker.tick.bind(ticker), 1000); 
// или setInterval(Ticker.prototype.tick.bind(ticker), 1000);

Answer 2

Возник вопрос в коде, а именно не инкрементируется значение this._i.

Происходит потеря контекста при вызове setInterval

Вариант №1:

function Ticker() { 
  this._i = 0; 
}; 
Ticker.prototype = { 
  tick: function() { 
    console.log(this._i++); 
  } 
}; 
var ticker = new Ticker(); 
// Вызов функции, обертка сохранит контекст  
setInterval(() => { 
  ticker.tick() 
}, 1000);

Вариант №2:

function Ticker() { 
  this._i = 0; 
  // Убрали в саму функцию 
  this.tick = () => { 
    console.log(this._i++); 
  } 
}; 
var ticker = new Ticker(); 
setInterval( 
  ticker.tick // Сохранит контекст 
, 1000);

  • Методы объектов и контекст вызова
READ ALSO
Vue.js отслеживание клика вне элемента

Vue.js отслеживание клика вне элемента

Есть следующая разметка:

465
Кнопка со сменой фона при нажатии [закрыт]

Кнопка со сменой фона при нажатии [закрыт]

Помогите с кодомПри нажатии цвет кнопки меняется

201
Что быстрее innerHTML или createElement appendChild

Что быстрее innerHTML или createElement appendChild

если создавать очень большое дерево, то ИМХО присвоение(=) в innerHTML быстрее чем создание дерева с помощью JSа вот как быть с наращиванием (+=) ?

198
Как можно реализовать подобную вещь? (js, jQuery)

Как можно реализовать подобную вещь? (js, jQuery)

Как можно реализовать вот такую вещь?

244