LINUX.ORG.RU

this и функции

 


0

1

разбираюсь с функциями setTimeout и setInterval(http://learn.javascript.ru/settimeout-setinterval).

Есть такой пример

function Runner() {

  this.steps = 0;
  this.step = function() {
    doSomethingHeavy();
    this.steps++;
  }
 
  function doSomethingHeavy() {
    for(var i=0; i<10000; i++) {
      this[i] = this.step + i;
    }
  }
 
}
 
var runner1 = new Runner();
var runner2 = new Runner();

// запускаем бегунов
setInterval(function() {
  runner1.step();
}, 15);
 
setTimeout(function go() {
  runner2.step();
  setTimeout(go, 15);
}, 15);
 
// кто сделает больше шагов?
setTimeout(function() {
  console.log(runner1.steps);
  console.log(runner2.steps);
}, 5000);

возникли трудности с понимание кода, в 4 строке this.step = функции, а в строке 11 this.step используется как свойство. Если после работы функций взять runner1[0] -> undefined, из этого следует что в doSomethingHeavy this свой... Кто может объясните как работает эта часть. Заранее спасибо.


Отвратительный пример. Внутри

doSomethingHeavy();
в качестве this будет подставлен global object, в результате в объекте окна будет куча мусора.

Закрой этот сайт и больше не открывай.

jerk-of-all-trades
()
Ответ на: комментарий от Apple-ch

согласен, в данном случае со строкой содержащей тело функции складывается число -> новая строка. Значит после вызова функций runner1 содержит числовые свойства содержащие строки(тело функции + число), но for(var i in runner1) выводится только step и steps.

RA
() автор топика
Ответ на: комментарий от jerk-of-all-trades

в global object не определена функция step а значит вернется undefined, что в сложении с числом даст NaN. Действительно обект window имеет числовые свойства содержащие NaN.

RA
() автор топика
"use strict";

напиши в начале файла, поудивляйся результатам. А вообще, если хочется this проконтролировать, добро пожаловать к Function.prototype.bind().

Deleted
()
Последнее исправление: Mystra_x64 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.