Метод вызова SetInterval с использованием .call(this) вызывает его только один раз

Привет, я совершенно новичок в JavaScript, и я пытаюсь что-то сделать, но я не могу понять, когда я вызываю эту функцию:

this.start = function () {
    this.interval = setInterval(startIncrement.call(this) , 1000);
}

startIncrement выполняется только один раз. Я пытаюсь создать класс Counter, который генерирует две кнопки (запуск и остановка) и одно текстовое поле. Итак, когда я это делаю:

var a = new Counter(); // generates object of Counter
a.init(); // generates the HTML (did that part)
a.start(); //start increasing the value of text box over period of time
a.stop(); // stops the counting (did that part)

А кнопки запуска и остановки просто имеют событие onclick, которое вызывает методы запуска и остановки счетчика. Я пробовал все ответы на этот вопрос setInterval запускается только один раз для метода объекта но это не сработало, и теперь я застрял.


person kuskmen    schedule 25.10.2015    source источник
comment
Первый ответ на этот вопрос - это ответ на ваш вопрос: setInterval ожидает, что ему будет передана функция, и вы передаете результат вызова своей функции startIncrement. Возможно, вы имели в виду .bind() вместо .call().   -  person Pointy    schedule 25.10.2015
comment
Да, теперь, когда вы так говорите, это имеет смысл, но, к сожалению, я не знаю, когда использовать вызов, привязку или применение. Я читал о них, но, кажется, я неправильно их использую... не могли бы вы мне объяснить как они работают, если у вас есть время? Заранее спасибо. P.S. Я уже просил об этом транжиру, но если хотите, можете и вы :)   -  person kuskmen    schedule 25.10.2015
comment
Ну, @spender объяснил .bind(), который является единственным из трех, который возвращает вам функцию для использования позже. И .call(), и .apply() — это способы немедленного вызова функции; они разные в деталях, но в основном делают одно и то же.   -  person Pointy    schedule 25.10.2015


Ответы (1)


Использование метода .call функции вызывает ее немедленно, при этом (первый) параметр становится this содержимого функции.

Используя

setInterval(startIncrement.call(this) , 1000);

вы немедленно вызываете метод startIncrement и используете все, что он возвращает, в качестве параметра для setInterval. Если он не возвращает функцию, это не то, что вам нужно.

Ты имел ввиду:

setInterval(startIncrement.bind(this) , 1000);

?

.bind вернет вам функцию, которая когда вы ее вызываете, гарантированно имеет (первый) параметр в качестве объекта this. Он не вызывает функцию. Он создает новую функцию, которая является оболочкой исходной функции, выполняя небольшую работу по изменению объекта this, когда он вызывает исходную функцию, которую он обертывает.

person spender    schedule 25.10.2015
comment
ДА! Я, должно быть, неправильно понял функции ... на самом деле, не могли бы вы объяснить мне больше о применении, вызове и привязке, потому что я читал их в течение одного часа и, кажется, использую их неправильно ... если у вас есть время, конечно. - person kuskmen; 25.10.2015